home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 25 / AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso / Magazin / Future-PD / FinalExistenceSourceCode.asc < prev    next >
Text File  |  1998-06-17  |  97KB  |  3,765 lines

  1. '***************************************************************************** 
  2. 'The Chrono Trigger Wanna-Be Engine
  3. 'By John C. Bintz of Internext Software
  4. 'Revision One Zillion+ 
  5. 'Version 1.0h
  6. 'Copyright © 1998 John C. Bintz.  All Rights Reserved.  Death to Microsoft.
  7. '
  8. 'This is, in no way whatsoever, connected with Squaresoft of Japan at all. 
  9. 'This RPG engine behaves in a way like my favorite role playing game engine
  10. 'so I'm paying hommage to its parent.  I'm not trying to suck money from 
  11. 'them, nor am I trying to infringe upon anything.  Don't sic the lawyers on me 
  12. 'guys.  I'm just trying to make the Amiga world a better place.
  13. '
  14. 'This puppy has taken probably around three hundred hours of coding, revising, 
  15. 'recoding, rerevising, and testing, and it STILL isn't done!   What I need is
  16. 'a way to draw on the screen.  Plus a team of fifty to write all my games
  17. 'for me.  8^)
  18. '
  19. 'But, now, with the FULLY INTEGRATED EDITOR (well, it just does it all...),  
  20. 'RPG creation will be a slice of pie, er, piece of cake. 
  21. '
  22. 'The Force will be with you, Amy.  Always.  And pray for a PPC Amos someday! 
  23. '***************************************************************************** 
  24.  
  25. 'Revision List 
  26. '============= 
  27. 'Version 1.0b to 1.0c
  28. '--------------------
  29. '* Added Pointer (AKA Squaresoft!) 
  30. '* Caching of Bob Images (VERY fast level loading!)
  31. '* Fixed MAX_ENEMY Bug 
  32. '* Fixed Fight Command Bug 
  33. '* Changed Text Screens From Separate Screen to Overlay (neat!)
  34. '* Other Stuff That I Forget I Did (but I'm sure it was important!)  
  35. '====================  
  36. 'Version 1.0c to 1.0d
  37. '--------------------
  38. '* Added the absolutely BUFF editor with Hypertexted Help document 
  39. '* Hacked MusiCRAFT so I could have GOOD sound 
  40. '* Added the SOUND operative so you can sync SOUND EFFECTS 
  41. '* CAPITALIZED a couple of things
  42. '====================
  43. 'Version 1.0d to 1.0e
  44. '--------------------
  45. '* Updated editor for faster speed and more intuitive use
  46. '* Fixed Frame Displaying, which skipped the first frame on FRAMEANIMs 
  47. '* Made certain commands multithreading for maximum speed! 
  48. '* Trimmed some arrays for memory saving 
  49. '* Allowed for smoother KILLing of objects before level loads
  50. '====================
  51. 'Version 1.0e to 1.0f
  52. '--------------------
  53. '* No more loading Amos to find level problems!  Error window displays 
  54. '  problem on Workbench Screen 
  55. '====================
  56. 'Version 1.0f to 1.0g
  57. '--------------------
  58. '* Small optimizations here and there... 
  59. '* Added QUAKE operative (which I ain't afraid of, of course!) 
  60. '* Allowed more than 255 bobs in an SBOBS bank (had to rewrite the entire
  61. '  frames routine, though...and on my second day off from school, too!)
  62. '* Never use the Trap instruction, especially on a function!  It thrashes
  63. '  Chip memory, which is always bad!  Just be sure your character really 
  64. '  exists when you use the COORDS command. 
  65. '* Changed the FIGHT routine.  Now, enemies are gauged in actual HP, ATK,
  66. '  DEF, and CHARGE.  Plus, there is also a Hit % calc that says you can
  67. '  still hit a guy, no matter what strength you are, and still cause damage. 
  68. '* Removed defunct "How this works" code...as I know how it works!  I wrote
  69. '  it, remember?  Saved a few K in source code.
  70. '====================
  71. 'Version 1.0g to 1.0h
  72. '--------------------
  73. '* DOOM Music Extension!  I think I might make the game 020 only, but I might
  74. '  also stick in the old Amos routines to make an 000 version.  PT Mods play 
  75. '  back PERFECTLY, with tempo and all!  SFX also don't kill the system.
  76. '* Forced Game Saving routine to stick '.game' onto end of game titles 
  77. '  without the extension 
  78.  
  79. Set Buffer 20
  80. Amos To Back 
  81. CMND$=Command Line$
  82. Screen Open 0,320,200,2,Lowres : Cls 0
  83. Palette $0,$FFF
  84. Degree 
  85. Randomize Timer
  86. Hide On 
  87. Led Off 
  88.  
  89. Erase 1 : Erase 12 : Ptm Stop : Erase 33
  90.  
  91. Close Editor 
  92. Close Workbench 
  93.  
  94. Assign "rpg:" To Dir$
  95.  
  96. Dim SCRVARNAME$(63),SCRPAUSE(255)
  97. Dim PARSE$(9),PV(9),IV(9),DISPLAY$(3),DISPLAY_JUMP$(3)
  98. Dim ITEMS$(255),ITEMHAVE(261),SCOMPILE$(99)
  99. Dim RATINGS(6),CHAR_FRAMEBASE(63)
  100. Dim CHAR_MOVEDIFF(63,1),CHAR_CANCOLLIDE(63)
  101. Dim TCH(63),CHAR_ANIMFRAME(63)
  102. Dim FRAME_DIDCHANGE(63)
  103.  
  104. Dim SCRIPT_CURRCOMMAND(63,3)
  105.  
  106. Dim FIGHT_ENEMIES(15),FIGHT_HP(15),FIGHT_POWER(15)
  107. Dim FIGHT_RESPONSE(16),FIGHT_CHARGE(16),FIGHT_ATTACK(15)
  108. Dim FIGHT_DEFENSE(15)
  109.  
  110. Dim ZNE_TYPE(255),MENU_VAR(9)
  111.  
  112. Dim EFFECT_SETTINGS(9),EFFECT_COLORS(9,9)
  113.  
  114. Dim NEWMENU$(9,1),NEWMENU_POS(9,1),MENU_COLORS(3)
  115.  
  116. Reserve As Work 45,64
  117.  
  118. Global SCRVARNAME$(),SCRPAUSE()
  119. Global PARSE$(),PV(),IV(),DISPLAY$(),DISPLAY_JUMP$()
  120. Global ITEMS$(),ITEMHAVE(),RATINGS(),CHAR_FRAMEBASE()
  121. Global CHAR_MOVEDIFF(),CHAR_CANCOLLIDE(),SCOMPILE$()
  122. Global TCH(),CHAR_ANIMFRAME(),FRAME_DIDCHANGE()
  123.  
  124. Global SCRIPT_CURRCOMMAND()
  125.  
  126. Global FIGHT_ENEMIES(),FIGHT_HP(),FIGHT_POWER(),FIGHT_RESPONSE()
  127. Global FIGHT_CHARGE(),FIGHT_ATTACK(),FIGHT_DEFENSE()
  128.  
  129. Global ZNE_TYPE(),MENU_VAR()
  130.  
  131. Global EFFECT_SETTINGS(),EFFECT_COLORS()
  132.  
  133. Global NEWMENU$(),NEWMENU_POS(),MENU_COLORS()
  134.  
  135. Global SCR_START,SCR_END,SCR_EOF,SCR_PARSE,SCR_CURR
  136. Global DAT_VARS,DAT_SCR,SCR_LEN,SCR_POS,SCR_MAX,SCR_BEGINHERE
  137. Global TXT_GRAB,TXT_POS,DISP_OPTION,DISP_GO
  138. Global DISP_ISOPEN,DISP_SWAP,ENEMY_MAX,IMDEAD
  139.  
  140. Global LEVEL_LOADNOW$,LEVEL_SKIPCHARXY,CHAR_NAME$,FRAMES_FILE$
  141. Global FRAMES_LOAD$
  142.  
  143. Global WALK_DELAY,OFFSET_CHANGE,ZNE_CHECKED
  144.  
  145. Global CHAR_XPOS,CHAR_YPOS,NOFRONTFADE,BLACKSCREEN
  146. Global MAP_WIDTH,MAP_HEIGHT,MAP_XPOS,MAP_YPOS
  147.  
  148. Global SSVTIMER,DISPLAY_SHOW,CURRMOD$,CURRLEVEL$
  149. Global CONTROLLOCK,FRAME_PTR,VB_LINE,WALKTHRUWALLS
  150.  
  151. 'Global _X1,_Y1,_X2,_Y2,_WHICH,PTR,A 
  152.  
  153. VB_LINE=250
  154.  
  155. EFFECT_COLORS(0,0)=2
  156. EFFECT_COLORS(0,1)=11
  157. EFFECT_COLORS(0,2)=12
  158.  
  159. EFFECT_COLORS(1,0)=31
  160. EFFECT_COLORS(1,1)=30
  161. EFFECT_COLORS(1,2)=29
  162.  
  163. MUS_NOPLAY=(Instr(Upper$(CMND$),"NOMUSIC")>0)
  164. CDROM=Exist("FE_FMV.iff")
  165.  
  166. ERR_FILE$="RPG:CTW_Error.abk"
  167. On Error Proc INEXT_ERRORTRAP
  168.  
  169. Amos To Front 
  170. Amos Lock 
  171.  
  172. 'Test New Code Here
  173.  
  174. 'Setup 
  175.  
  176. NEWFRAME_SETUP
  177. ITEM_PREP
  178. GLOVAR_PREP
  179. SCOMPILE_SETUP
  180.  
  181. 'Intro Animation 
  182.  
  183. Load "InextIntro.abk",255
  184. S=Start(255)
  185. S=Frame Play(S,1,7)
  186. Double Buffer : Autoback 0
  187. T=Timer+2
  188. Repeat 
  189.   Repeat : Until Timer>T
  190.   OS=S
  191.   S=Frame Play(S,1,7)
  192.   If S<>OS
  193.     Screen Swap : T=Timer+2
  194.   End If 
  195. Until S=OS
  196. T=Timer+30 : Repeat : Until Timer>T
  197. Fade 2 : T=Timer+30 : Repeat : Until Timer>T
  198. Screen Close 7
  199. Erase 255
  200.  
  201. If CDROM
  202.   FMV["FE_FMV.iff"]
  203. End If 
  204.  
  205. BACKTOINTRO:
  206. Screen Open 0,320,200,2,Lowres : Cls 0
  207. Palette $0,$FFF
  208. CHAR_NAME$="Mike"
  209. ZNEJUMP_LEAVE=-1
  210. IMDEAD=False
  211.  
  212. RATING_SET["HP",50]
  213. RATING_SET["MHP",50]
  214. RATING_SET["STR",5]
  215. RATING_SET["DEX",5]
  216. RATING_SET["INT",5]
  217. RATING_SET["CRED",50]
  218.  
  219. FULLINTRO
  220. WHICH=Param
  221.  
  222. If WHICH=0
  223.   If Key State(20)
  224.     Clear Key 
  225.     Print "Variable Space Free:";Free
  226.     Line Input "Name Of Level To Load:";LVL$
  227.     LEVEL_LOAD[LVL$]
  228.   Else 
  229.     LEVEL_LOAD["level1.level"]
  230.   End If 
  231. Else If WHICH=1
  232.   Show On 
  233.   FILE$=Fsel$("*.game","","Choose a Saved Game File")
  234.   Hide On 
  235.   DIDLOAD=False
  236.   If FILE$<>"" : If Exist(FILE$)
  237.       DIDLOAD=True
  238.       GAME_LOAD[FILE$]
  239.   End If : End If 
  240.   If DIDLOAD=False : Goto BACKTOINTRO : End If 
  241. Else If WHICH=2
  242.   If CDROM
  243.     FMV["FE_FMV.iff"]
  244.   Else 
  245.     Load "CDROMOnly.spk",512
  246.     Unpack 512 To 6 : Screen Hide 6
  247.     Screen Open 7,320,200,4096,Lowres : Flash Off : Curs Off : Cls 0
  248.     Get Palette 6
  249.     For I=0 To 99
  250.       Screen Copy 6,0,I*2,320,(I*2)+1 To 7,0,I*2
  251.       Screen Copy 6,0,199-(I*2),320,200-(I*2) To 7,0,199-(I*2)
  252.       If(I and 3)=0 : Wait Vbl : End If 
  253.     Next 
  254.     Screen Close 6
  255.     T=Timer+200
  256.     Repeat : Until Timer>T or Fire(1)
  257.     Screen 7
  258.     For I=0 To 99
  259.       Cls 0,0,I*2 To 320,(I*2)+1
  260.       Cls 0,0,199-(I*2) To 320,200-(I*2)
  261.       If(I and 3)=0 : Wait Vbl : End If 
  262.     Next 
  263.     Screen Close 7
  264.   End If 
  265.   Goto BACKTOINTRO
  266. Else If WHICH=3
  267.   Erase 1 : Ptm Stop : Erase 33
  268.   Amos Unlock 
  269.   Edit 
  270. End If 
  271.  
  272. Do 
  273.   If TXT_GRAB=-1
  274.     If Key State(68)
  275.       NEWMENU_ROUTINE
  276.     End If 
  277.     If Key State(16)
  278.       Screen 2 : Fade 2
  279.       For I=63 To 0 Step -4
  280.         Ptm Volume I : Wait Vbl 
  281.       Next 
  282.       Wait 14 : Ptm Stop : Erase 33
  283.       CURRMOD$=""
  284.       Goto BACKTOINTRO
  285.     End If 
  286.     SNAPSHOT
  287.     If Not CONTROLLOCK : If Not BLACKSCREEN
  288.       If Timer>WALK_DELAY
  289.         OXPOS=CHAR_XPOS : OYPOS=CHAR_YPOS
  290.         If Joy(1)>0
  291.           A=-1
  292.           If Jleft(1)
  293.             CHAR_XPOS=CHAR_XPOS-4
  294.             If CHAR_XPOS<0 : CHAR_XPOS=0 : End If 
  295.           End If 
  296.           If Jright(1)
  297.             CHAR_XPOS=CHAR_XPOS+4
  298.             If CHAR_XPOS>MAP_WIDTH : CHAR_XPOS=MAP_WIDTH : End If 
  299.           End If 
  300.           
  301.           If CHAR_XPOS<>OXPOS
  302.             MAP_ZONECHECK[CHAR_XPOS,CHAR_YPOS] : A=Param
  303.             If A=0 : CHAR_XPOS=OXPOS : End If 
  304.             If A=1 : WALK_DELAY=Timer+10 : End If 
  305.             If A=2
  306.               MAP_ZONEGETVAR[ZNE_CHECKED,0] : B=Param
  307.               MAP_ZONEGETVAR[ZNE_CHECKED,1] : CHAR_XPOS=Param
  308.               MAP_ZONEGETVAR[ZNE_CHECKED,2] : CHAR_YPOS=Param
  309.               LEVEL_LOADNOW$="level"+(Str$(B)-" ")+".level"
  310.               LEVEL_SKIPCHARXY=((CHAR_XPOS>-1) and(CHAR_YPOS>-1))
  311.             End If 
  312.             If A=3
  313.               MAP_ZONEGETVAR[ZNE_CHECKED,0] : GROUP=Param
  314.               FIGHT_SETUP[GROUP]
  315.             End If 
  316.             If A=4
  317.               If ZNEJUMP_LEAVE=-1
  318.                 MAP_ZONEGETVAR[ZNE_CHECKED,0] : CHAR=Param
  319.                 MAP_ZONEGETVAR[ZNE_CHECKED,1] : LBL=Param
  320.                 SCRIPT_JUMP[CHAR,"ZONELABEL"+(Str$(LBL)-" ")]
  321.                 ZNEJUMP_LEAVE=ZNEJUMP_CHECKED
  322.               End If 
  323.             End If 
  324.             If ZNEJUMP_LEAVE<>ZNE_CHECKED : ZNEJUMP_LEAVE=-1 : End If 
  325.             
  326.             CHAR_COLLIDE[6]
  327.             If Param>-1
  328.               CHAR_YPOS=OYPOS : SCR=Param
  329.               If CHAR_CANCOLLIDE(SCR)
  330.                 SCRIPT_JUMP[SCR,"COLLIDE"]
  331.               End If 
  332.             End If 
  333.           End If 
  334.           
  335.           If A=2 : Goto QUICKJUMP : End If 
  336.           
  337.           If Jup(1)
  338.             CHAR_YPOS=CHAR_YPOS-4
  339.             If CHAR_YPOS<0 : CHAR_YPOS=0 : End If 
  340.           End If 
  341.           If Jdown(1)
  342.             CHAR_YPOS=CHAR_YPOS+4
  343.             If CHAR_YPOS>MAP_HEIGHT : CHAR_YPOS=MAP_HEIGHT : End If 
  344.           End If 
  345.           
  346.           If CHAR_YPOS<>OYPOS
  347.             MAP_ZONECHECK[CHAR_XPOS,CHAR_YPOS] : A=Param
  348.             If A=0 : CHAR_YPOS=OYPOS : End If 
  349.             If A=1 : WALK_DELAY=Timer+10 : End If 
  350.             If A=2
  351.               MAP_ZONEGETVAR[ZNE_CHECKED,0] : B=Param
  352.               MAP_ZONEGETVAR[ZNE_CHECKED,1] : CHAR_XPOS=Param
  353.               MAP_ZONEGETVAR[ZNE_CHECKED,2] : CHAR_YPOS=Param
  354.               LEVEL_LOADNOW$="level"+(Str$(B)-" ")+".level"
  355.               LEVEL_SKIPCHARXY=((CHAR_XPOS>-1) and(CHAR_YPOS>-1))
  356.             End If 
  357.             If A=3
  358.               MAP_ZONEGETVAR[ZNE_CHECKED,0] : GROUP=Param
  359.               FIGHT_SETUP[GROUP]
  360.             End If 
  361.             If A=4
  362.               If ZNEJUMP_LEAVE=-1
  363.                 MAP_ZONEGETVAR[ZNE_CHECKED,0] : CHAR=Param
  364.                 MAP_ZONEGETVAR[ZNE_CHECKED,1] : LBL=Param
  365.                 SCRIPT_JUMP[CHAR,"ZONELABEL"+(Str$(LBL)-" ")]
  366.                 ZNEJUMP_LEAVE=ZNE_CHECKED
  367.               End If 
  368.             End If 
  369.             If ZNEJUMP_LEAVE<>ZNE_CHECKED : ZNEJUMP_LEAVE=-1 : End If 
  370.             
  371.             CHAR_COLLIDE[6]
  372.             If Param>-1
  373.               CHAR_YPOS=OYPOS : SCR=Param
  374.               If CHAR_CANCOLLIDE(SCR)
  375.                 SCRIPT_JUMP[SCR,"COLLIDE"]
  376.               End If 
  377.             End If 
  378.           End If 
  379.           
  380.           If Fire(1)
  381.             CHAR_COLLIDE[Deek(Sprite Base(I Bob(0) and $3FFF)+2)]
  382.             If Param>-1
  383.               W=Param
  384.               CHAR_FACE[0,W]
  385.               SCRIPT_JUMP[W,"TOUCH"]
  386.             End If 
  387.           End If 
  388.           
  389.           QUICKJUMP:
  390.           
  391.           CHAR_MOVEDIFF[0]
  392.           NEWFRAME_LOOP[0,False]
  393.         End If 
  394.       End If : End If 
  395.     End If 
  396.   End If 
  397.   
  398.   SCRIPT_NEXTCMND
  399.   If IMDEAD
  400.     Screen 2 : Fade 2
  401.     CURRMOD$=""
  402.     For I=63 To 0 Step -4
  403.       Ptm Volume I : Wait Vbl 
  404.     Next 
  405.     Wait 14 : Ptm Stop : Erase 33
  406.     Goto BACKTOINTRO
  407.   End If 
  408.   LEVEL_CHECK
  409.   If CONTROLLOCK
  410.     CHAR_XPOS=X Bob(0)
  411.     CHAR_YPOS=Y Bob(0)
  412.     SCRNSAVER_KILL
  413.   End If 
  414.   Bob 0,CHAR_XPOS,CHAR_YPOS,
  415.   MAP_DISPLAY
  416.   SCRNSAVER
  417. Loop 
  418.  
  419. Procedure CHAR_MOVEDIFF[WHICH]
  420.   On Error Proc INEXT_ERRORTRAP
  421.   DX=X Bob(WHICH)-CHAR_MOVEDIFF(WHICH,0)
  422.   DY=Y Bob(WHICH)-CHAR_MOVEDIFF(WHICH,1)
  423.   If DX<>0 or DY<>0
  424.     NEWFRAME_CURRFRAMESET[WHICH] : CF=Param
  425.     If Abs(DX)>Abs(DY)
  426.       If DX>0 : NF=2
  427.     Else : NF=3 : End If 
  428.     Else 
  429.       If DY>0 : NF=0
  430.     Else : NF=1 : End If 
  431.     End If 
  432.     NF=NF+CHAR_FRAMEBASE(WHICH)
  433.     If NF<>CF
  434.       NEWFRAME_SET[WHICH,NF,False]
  435.     End If 
  436.     CHAR_MOVEDIFF(WHICH,0)=X Bob(WHICH)
  437.     CHAR_MOVEDIFF(WHICH,1)=Y Bob(WHICH)
  438.   End If 
  439. End Proc
  440.  
  441. Procedure SCRIPT_PREP
  442.   On Error Proc INEXT_ERRORTRAP
  443.   SCR_MAX=-1 : TXT_GRAB=-1 : SCR_CURR=0
  444.   Erase 69 : Erase 70
  445.   Reserve As Work 68,65536 : Rem Variables
  446.   Reserve As Work 67,5120 : Rem Scripts and Groups 
  447.   
  448.   DAT_VARS=Start(68) : DAT_SCR=Start(67)
  449. End Proc
  450. Procedure SCRIPT_SKIP
  451.   On Error Proc INEXT_ERRORTRAP
  452.   Loke DAT_SCR+(SCR_CURR*12),0
  453.   Loke DAT_SCR+(SCR_CURR*12)+4,0
  454.   Inc SCR_CURR : Inc SCR_MAX
  455. End Proc
  456. Procedure SCRIPT_LOAD[FILE$]
  457.   On Error Proc INEXT_ERRORTRAP
  458.   If Not Exist(FILE$)
  459.     INEXT_ERROR["Cannot Find .script File","",FILE$]
  460.   End If 
  461.   Open In 1,FILE$
  462.   Reserve As Work 69,Lof(1)
  463.   Sload 1 To 69,Lof(1)
  464.   Close 1
  465.   SCR_START=Start(69) : SCR_END=Start(69)+Length(69)-1
  466.   Lfilter 0,31,32,Start(69) To SCR_END
  467.   
  468.   Reserve As Work 71,Length(69)
  469.   
  470.   PTR=Start(69) : CURRVAR=0 : MPTR=Start(71)
  471.   CHAR_CANCOLLIDE(SCR_CURR)=False
  472.   SCRIPT_CURRCOMMAND(SCR_CURR,0)=-1
  473.   SCRPAUSE(SCR_CURR)=0
  474.   CHAR_ANIMFRAME(SCR_CURR)=False
  475.   Repeat 
  476.     SCRIPT_GETCMND[PTR] : PTR=Param
  477.     
  478.     If Not SCR_EOF
  479.       SP$=""
  480.       For I=0 To SCR_PARSE
  481.         If Asc(PARSE$(I))=64
  482.           A=-1
  483.           For J=0 To CURRVAR
  484.             If SCRVARNAME$(J)=PARSE$(I)
  485.               A=J : J=255
  486.             End If 
  487.           Next 
  488.           If A>-1
  489.             PARSE$(I)=Str$(A)-" "
  490.           Else 
  491.             SCRVARNAME$(CURRVAR)=PARSE$(I)
  492.             PARSE$(I)=Str$(CURRVAR)-" "
  493.             Inc CURRVAR
  494.           End If 
  495.           PARSE$(I)="@"+PARSE$(I)
  496.         End If 
  497.         If I=0
  498.           For J=0 To 99
  499.             If SCOMPILE$(J)=PARSE$(0)
  500.               PARSE$(0)=Chr$(J+69) : J=99
  501.             End If 
  502.           Next 
  503.         End If 
  504.         If I=SCR_PARSE
  505.           PARSE$(I)=PARSE$(I)+"|"
  506.         Else 
  507.           PARSE$(I)=PARSE$(I)+" "
  508.         End If 
  509.         SP$=SP$+PARSE$(I)
  510.       Next 
  511.       Lbstr SP$,MPTR
  512.       MPTR=MPTR+Len(SP$)
  513.       If Upper$(PARSE$(0))=":COLLIDE|"
  514.         CHAR_CANCOLLIDE(SCR_CURR)=True
  515.       End If 
  516.     End If 
  517.   Until SCR_EOF
  518.   For I=0 To CURRVAR
  519.     SCRVARNAME$(I)=""
  520.   Next 
  521.   
  522.   TCH(SCR_CURR)=False
  523.   
  524.   SCR_EOF=False
  525.   Bank Shrink 71 To MPTR-Start(71)
  526.   SCR_LEN=Length(71)
  527.   
  528.   If Length(70)=0
  529.     Reserve As Work 70,Length(71)
  530.     Copy Start(71),Start(71)+Length(71) To Start(70)
  531.     SCR_POS=0
  532.   Else 
  533.     SCR_POS=Length(70)
  534.     Reserve As Work 72,Length(70)+Length(71)
  535.     Copy Start(70),Start(70)+Length(70) To Start(72)
  536.     Copy Start(71),Start(71)+Length(71) To Start(72)+Length(70)
  537.     Bank Swap 72,70 : Erase 72
  538.   End If 
  539.   SCR_BEGINHERE=Start(70)
  540.   
  541.   D=SCR_CURR*12
  542.   Loke DAT_SCR+D,SCR_POS
  543.   Loke DAT_SCR+D+4,SCR_LEN
  544.   Loke DAT_SCR+D+8,0
  545.   Erase 71 : Inc SCR_CURR : Inc SCR_MAX
  546. End Proc
  547. Procedure SCOMPILE_SETUP
  548.   On Error Proc INEXT_ERRORTRAP
  549.   Open In 1,"CompileList.txt"
  550.   Set Input 10,-1
  551.   Repeat 
  552.     Line Input #1,A$
  553.     If Lwords(A$)=2
  554.       SCOMPILE$(Val(Lword(1,A$)))=Upper$(Lword(2,A$))
  555.     End If 
  556.   Until Eof(1)
  557.   Close 1
  558. End Proc
  559.  
  560. Procedure SNAPSHOT
  561.   If Key State(89)
  562.     S=Screen : Screen 2
  563.     A$=Fsel$("*.iff","","Enter a name for the Snapshot")
  564.     If A$<>"" : Save Iff A$ : End If 
  565.     Screen S
  566.   End If 
  567. End Proc
  568.  
  569. Procedure SCRIPT_GROUP[V,S]
  570.   On Error Proc INEXT_ERRORTRAP
  571.   Loke DAT_SCR+3072+(SCR_CURR*4),V
  572.   Loke DAT_SCR+4096+(SCR_CURR*4),S
  573. End Proc
  574.  
  575. Procedure SCRIPT_GETGROUP[NUM]
  576.   On Error Proc INEXT_ERRORTRAP
  577.   ENEMY_MAX=-1
  578.   For I=1 To SCR_MAX
  579.     If Leek(DAT_SCR+3072+I*4)=NUM
  580.       If X Bob(I)>-50 and Y Bob(I)>-50
  581.         Inc ENEMY_MAX
  582.         FIGHT_ENEMIES(ENEMY_MAX)=I
  583.         FIGHT_POWER(ENEMY_MAX)=Leek(DAT_SCR+4096+I*4)
  584.       End If 
  585.     End If 
  586.   Next 
  587. End Proc
  588. Procedure SCRIPT_SCRGROUP[WHICH]
  589.   On Error Proc INEXT_ERRORTRAP
  590. End Proc[Leek(DAT_SCR+3072+WHICH*4)]
  591.  
  592. Procedure CHAR_SET[FILE$,X,Y,F,V,S]
  593.   'On Error Proc INEXT_ERRORTRAP 
  594.   SCRIPT_GROUP[V,S]
  595.   NEWFRAME_SET[SCR_CURR,F,False]
  596.   For I=0 To 3
  597.     NEWFRAME_GRABSET[F+I]
  598.   Next 
  599.   CHAR_FRAMEBASE(SCR_CURR)=F
  600.   Bob SCR_CURR,X,Y,
  601.   CHAR_MOVEDIFF(SCR_CURR,0)=X
  602.   CHAR_MOVEDIFF(SCR_CURR,1)=Y
  603.   SCRIPT_LOAD[FILE$]
  604. End Proc
  605.  
  606. Procedure SCRIPT_NEXTCMND
  607.   'On Error Proc INEXT_ERRORTRAP 
  608.   Shared MUS_NOPLAY
  609.   If DISP_ISOPEN and DISP_GO
  610.     DISPLAY_WAIT
  611.   Else 
  612.     Comp Test Off 
  613.     For SCR_CURR=0 To SCR_MAX
  614.       If X Bob(SCR_CURR)>-50 and Y Bob(SCR_CURR)>-50
  615.         If Timer>SCRPAUSE(SCR_CURR)
  616.           If CHAR_ANIMFRAME(SCR_CURR)
  617.             NEWFRAME_MOVE[SCR_CURR,False]
  618.             CHAR_ANIMFRAME(SCR_CURR)= Not Param
  619.             If Not CHAR_ANIMFRAME(SCR_CURR)
  620.               NEWFRAME_CHANGE[SCR_CURR]
  621.               If Not Param
  622.                 CHAR_MOVEDIFF[SCR_CURR]
  623.               End If 
  624.             End If 
  625.           Else 
  626.             If SCRIPT_CURRCOMMAND(SCR_CURR,0)=-1
  627.               SC=SCR_CURR*12
  628.               SCR_START=SCR_BEGINHERE+Leek(DAT_SCR+SC)
  629.               SCR_END=SCR_START+Leek(DAT_SCR+SC+4)
  630.               
  631.               If SCR_START<>SCR_END
  632.                 PTR=SCR_START+Leek(DAT_SCR+SC+8)
  633.                 OPTR=PTR
  634.                 
  635.                 A=Hunt(PTR To SCR_END,"|")
  636.                 If A=0
  637.                   SCR_EOF=True
  638.                   Goto __STOPSCR
  639.                 Else 
  640.                   SCR_EOF=False
  641.                   A$=Lstr(PTR,A-PTR) : A=A+1
  642.                   SCR_PARSE=Lwords(A$)
  643.                   For I=1 To SCR_PARSE
  644.                     PARSE$(I-1)=Lword(I,A$)
  645.                   Next 
  646.                   SCR_PARSE=SCR_PARSE-1
  647.                 End If 
  648.                 __STOPSCR:
  649.                 
  650.                 If Not SCR_EOF
  651.                   PTR=A
  652.                   C=-1
  653.                   If Len(PARSE$(0))=1
  654.                     C=Asc(PARSE$(0))-69
  655.                   End If 
  656.                   SCRIPT_CURRCOMMAND(SCR_CURR,0)=C
  657.                   SCRIPT_CURRCOMMAND(SCR_CURR,1)=-1
  658.                   
  659.                   FRAME_DIDCHANGE(SCR_CURR)=False
  660.                   
  661.                   If SCR_PARSE>0
  662.                     XYZ=SCR_CURR*256
  663.                     For I=1 To SCR_PARSE
  664.                       If Asc(PARSE$(I))=64
  665.                         IV(I)=Val(Mid$(PARSE$(I),2))
  666.                         PV(I)=Leek(DAT_VARS+XYZ+IV(I)*4)
  667.                       Else 
  668.                         PV(I)=Val(PARSE$(I))
  669.                         IV(I)=-1
  670.                       End If 
  671.                     Next 
  672.                   End If 
  673.                   If TXT_GRAB=SCR_CURR
  674.                     If(C<>50 and C<>51)
  675.                       If TXT_POS>0
  676.                         DISP_GO=True
  677.                         DISPLAY_FIGOPTIONS
  678.                         DISPLAY_TEXT
  679.                         Repeat 
  680.                           DISPLAY_WAIT
  681.                         Until Not DISP_GO
  682.                       End If 
  683.                       DISPLAY_CLOSE
  684.                       TXT_GRAB=-1 : TXT_POS=0
  685.                     End If 
  686.                   End If 
  687.                 End If 
  688.               End If 
  689.             Else 
  690.               C=SCRIPT_CURRCOMMAND(SCR_CURR,0)
  691.             End If 
  692.             
  693.             OXBOB=X Bob(SCR_CURR)
  694.             OYBOB=Y Bob(SCR_CURR)
  695.             
  696.             Gosub CMNDSET1
  697.             
  698.             If TXT_GRAB=SCR_CURR
  699.               If TXT_POS=4
  700.                 DISP_GO=True
  701.                 DISPLAY_FIGOPTIONS
  702.                 DISPLAY_TEXT
  703.                 Repeat 
  704.                   DISPLAY_WAIT
  705.                 Until Not DISP_GO
  706.                 TXT_POS=0
  707.               End If 
  708.             End If 
  709.             
  710.             NEWFRAME_CHANGE[SCR_CURR]
  711.             TA= Not Param
  712.             TB= Not WALKTHRUWALLS
  713.             If TA and TB
  714.               X=X Bob(SCR_CURR) : Y=Y Bob(SCR_CURR)
  715.               MAP_ZONECHECK[X,Y] : A=Param
  716.               If A=0 : X=OXBOB : End If 
  717.               MAP_ZONECHECK[X,Y] : A=Param
  718.               If A=0 : Y=OYBOB : End If 
  719.               Bob SCR_CURR,X,Y,
  720.             End If 
  721.             If Not NOSETPOINTER
  722.               If OPTR=SCR_START+Leek(DAT_SCR+SC+8)
  723.                 Loke DAT_SCR+SC+8,PTR-SCR_START
  724.                 NOSETPOINTER=False
  725.               End If 
  726.             End If 
  727.           End If 
  728.         End If 
  729.         NEWFRAME_CHANGE[SCR_CURR] : DC=Param
  730.         If DC and Not FRAME_DIDCHANGE(SCR_CURR)
  731.           NEWFRAME_LOOP[SCR_CURR,False]
  732.         End If 
  733.       End If 
  734.     Next 
  735.     SUPERSKIP:
  736.     Comp Test On 
  737.   End If 
  738.   Pop Proc
  739.   CMNDSET1:
  740.   'If C$="SET" 
  741.   If C=52 : Return : End If 
  742.   If C=0
  743.     VAR_SET[IV(1),PV(2)]
  744.     'Else If C$="MATH" 
  745.   Else If C=1
  746.     O$=PARSE$(2)
  747.     If O$="+"
  748.       RES=PV(1)+PV(3)
  749.     Else If O$="-"
  750.       RES=PV(1)-PV(3)
  751.     Else If O$="*"
  752.       RES=PV(1)*PV(3)
  753.     Else If O$="/" and PV(3)<>0
  754.       RES=PV(1)/PV(3)
  755.     Else If O$="%" and PV(3)<>0
  756.       RES=PV(1) mod PV(3)
  757.     Else If O$="="
  758.       RES=(PV(1)=PV(3))
  759.     Else If O$="<"
  760.       RES=(PV(1)<PV(3))
  761.     Else If O$=">"
  762.       RES=(PV(1)>PV(3))
  763.     Else If O$="<=" or O$="=<"
  764.       RES=(PV(1)<=PV(3))
  765.     Else If O$="=>" or O$=">="
  766.       RES=(PV(1)=>PV(3))
  767.     Else If O$="<>"
  768.       RES=(PV(1)<>PV(3))
  769.     End If 
  770.     If SCR_PARSE=4
  771.       VAR_SET[IV(4),RES]
  772.     Else 
  773.       VAR_SET[IV(1),RES]
  774.     End If 
  775.     'Else If C$="PAUSE"
  776.   Else If C=2
  777.     SCRPAUSE(SCR_CURR)=Timer+PV(1)*50
  778.   Else If C=3
  779.     'Else If C$="FACE" 
  780.     A=Instr("SNEW",Upper$(PARSE$(1)))
  781.     If A=0
  782.       CHAR_MOVEDIFF(SCR_CURR,0)=X Bob(SCR_CURR)+(X Bob(SCR_CURR)-X Bob(PV(1)))
  783.       CHAR_MOVEDIFF(SCR_CURR,1)=Y Bob(SCR_CURR)+(Y Bob(SCR_CURR)-Y Bob(PV(1)))
  784.       CHAR_MOVEDIFF[SCR_CURR]
  785.     Else 
  786.       CF=CHAR_FRAMEBASE(SCR_CURR)+A-1
  787.       NEWFRAME_SET[SCR_CURR,CF,False]
  788.     End If 
  789.     'Else If C$="FRAMEANIM"
  790.   Else If C=4
  791.     CHAR_ANIMFRAME(SCR_CURR)=True
  792.     NEWFRAME_SET[SCR_CURR,PV(1),False]
  793.     NEWFRAME_RESET
  794.     NEWFRAME_GRABSET[PV(1)]
  795.     NEWFRAME_FULLREQUEST
  796.     'Else If C$="MENURESET"
  797.   Else If C=5
  798.     NEWMENU_RESET
  799.     'Else If C$="MENUADD"
  800.   Else If C=6
  801.     NEWMENU_ADD[PARSE$(1)-Chr$(34),PARSE$(2)-Chr$(34)]
  802.     'Else If C$="MENUCHOICE" 
  803.   Else If C=7
  804.     NEWMENU_CHOICE
  805.     A=Param : VAR_SET[IV(1),A]
  806.     'Else If C$="MOVE" 
  807.   Else If C=8
  808.     X=X Bob(SCR_CURR)+PV(1) : Y=Y Bob(SCR_CURR)+PV(2)
  809.     Bob SCR_CURR,X,Y,
  810.     NEWFRAME_LOOP[SCR_CURR,False]
  811.     CHAR_MOVEDIFF[SCR_CURR]
  812.   End If 
  813.   'If C$="GOTO"
  814.   If C=9
  815.     LABEL$=":"+PARSE$(1)
  816.     A=Hunt(SCR_START To SCR_END,LABEL$)
  817.     If A>0 : PTR=A+Len(LABEL$)+1 : End If 
  818.     'Else If C$="ONGOTO" 
  819.   Else If C=10
  820.     JMP=(PV(2)-PV(1))+3
  821.     If JMP=<SCR_PARSE
  822.       LABEL$=":"+PARSE$(JMP)
  823.       A=Hunt(SCR_START To SCR_END,LABEL$)
  824.       If A>0 : PTR=A+Len(LABEL$)+1 : End If 
  825.     End If 
  826.     'Else If C$="LABELJUMP"
  827.   Else If C=11
  828.     SCRIPT_JUMP[PV(1),PARSE$(2)]
  829.     NOSETPOINTER=(SCR_CURR=PV(1))
  830.     'Else If C$="TOGGLETOUCH"
  831.   Else If C=12
  832.     TCH(SCR_CURR)= Not TCH(SCR_CURR)
  833.     'Else If C$="WALK" 
  834.   Else If C=13
  835.     If SCRIPT_CURRCOMMAND(SCR_CURR,1)=-1
  836.       SCRIPT_CURRCOMMAND(SCR_CURR,1)=PV(1)
  837.       SCRIPT_CURRCOMMAND(SCR_CURR,2)=PV(2)
  838.       SCRIPT_CURRCOMMAND(SCR_CURR,3)=PV(3)
  839.     End If 
  840.     D=SCRIPT_CURRCOMMAND(SCR_CURR,1)
  841.     S=SCRIPT_CURRCOMMAND(SCR_CURR,2)
  842.     T=SCRIPT_CURRCOMMAND(SCR_CURR,3)
  843.     X=X Bob(SCR_CURR) : Y=Y Bob(SCR_CURR)
  844.     If D=0
  845.       Y=Y-S
  846.     Else If D=1
  847.       Y=Y+S
  848.     Else If D=2
  849.       X=X-S
  850.     Else If D=3
  851.       X=X+S
  852.     End If 
  853.     Bob SCR_CURR,X,Y,
  854.     NEWFRAME_LOOP[SCR_CURR,False]
  855.     CHAR_MOVEDIFF[SCR_CURR]
  856.     T=T-1
  857.     If T=0 : SCRIPT_CURRCOMMAND(SCR_CURR,0)=-1 : End If 
  858.     SCRIPT_CURRCOMMAND(SCR_CURR,3)=T
  859.     'Else If C$="KEYDOWN"
  860.   Else If C=14
  861.     A$=Upper$(Inkey$)
  862.     VAR_SET[IV(2),Upper$(PARSE$(1))=A$]
  863.     'Else If C$="TOGGLEDISPLAY"
  864.   Else If C=15
  865.     DISPLAY_SHOW= Not DISPLAY_SHOW
  866.     'Else If C$="WALKTO" 
  867.   Else If C=16
  868.     If SCRIPT_CURRCOMMAND(SCR_CURR,1)=-1
  869.       SCRIPT_CURRCOMMAND(SCR_CURR,1)=PV(1)
  870.       SCRIPT_CURRCOMMAND(SCR_CURR,2)=PV(2)
  871.       SCRIPT_CURRCOMMAND(SCR_CURR,3)=PV(3)
  872.     End If 
  873.     X=X Bob(SCR_CURR) : Y=Y Bob(SCR_CURR)
  874.     DX=SCRIPT_CURRCOMMAND(SCR_CURR,1)
  875.     DY=SCRIPT_CURRCOMMAND(SCR_CURR,2)
  876.     SPEED=SCRIPT_CURRCOMMAND(SCR_CURR,3)
  877.     FX=DX-X : FY=DY-Y
  878.     GD=Max(Abs(FX),Abs(FY))
  879.     'GD=(Abs(FX)+Abs(FY))/2
  880.     If SPEED>GD
  881.       X=DX : Y=DY
  882.       SCRIPT_CURRCOMMAND(SCR_CURR,0)=-1
  883.     Else 
  884.       X=X+(FX*SPEED)/GD
  885.       Y=Y+(FY*SPEED)/GD
  886.       MAP_ZONECHECK[X,OYBOB]
  887.       If Param=0 : X=OXBOB : Y=OYBOB+(FY*SPEED)/FY : End If 
  888.       MAP_ZONECHECK[OXBOB,Y]
  889.       If Param=0 : Y=OYBOB : X=OXBOB+(FX*SPEED)/FX : End If 
  890.     End If 
  891.     Bob SCR_CURR,X,Y,
  892.     NEWFRAME_LOOP[SCR_CURR,False]
  893.     CHAR_MOVEDIFF[SCR_CURR]
  894.     'VAR_SET[IV(4),(X=DX) and(Y=DY)] 
  895.     'Else If C$="CHANGEFRAMEBASE"
  896.   Else If C=17
  897.     CHAR_FRAMEBASE(SCR_CURR)=PV(1)
  898.     'Else If C$="MOVETO" 
  899.   Else If C=18
  900.     Bob SCR_CURR,PV(1),PV(2),
  901.     CHAR_MOVEDIFF(SCR_CURR,0)=X Bob(SCR_CURR)
  902.     CHAR_MOVEDIFF(SCR_CURR,1)=Y Bob(SCR_CURR)
  903.     'Else If C$="IF" 
  904.   Else If C=19
  905.     If SCR_PARSE=2
  906.       RES=(PV(1)=True) : P=2
  907.     Else 
  908.       O$=PARSE$(2) : P=4
  909.       If O$="="
  910.         RES=(PV(1)=PV(3))
  911.       Else If O$="<"
  912.         RES=(PV(1)<PV(3))
  913.       Else If O$=">"
  914.         RES=(PV(1)>PV(3))
  915.       Else If O$="<=" or O$="=<"
  916.         RES=(PV(1)<=PV(3))
  917.       Else If O$="=>" or O$=">="
  918.         RES=(PV(1)=>PV(3))
  919.       Else If O$="<>"
  920.         RES=(PV(1)<>PV(3))
  921.       End If 
  922.     End If 
  923.     If RES
  924.       LABEL$=":"+PARSE$(P)
  925.       A=Hunt(SCR_START To SCR_END,LABEL$)
  926.       If A>0 : PTR=A+Len(LABEL$)+1 : End If 
  927.     End If 
  928.     'Else If C$="WAIT" 
  929.   Else If C=20
  930.     SCRPAUSE(SCR_CURR)=Timer+PV(1)
  931.     'Else If C$="RND"
  932.   Else If C=21
  933.     VAR_SET[IV(1),Rnd(PV(2))]
  934.     'Else If C$="TIMER"
  935.   Else If C=22
  936.     VAR_SET[IV(1),Timer]
  937.     'Else If C$="GLOSET" 
  938.   Else If C=23
  939.     GLOVAR_SET[PV(1),PV(2)]
  940.     'Else If C$="GLOGET" 
  941.   Else If C=24
  942.     GLOVAR_GET[PV(1)] : A=Param : VAR_SET[IV(2),A]
  943.     'Else If C$="BITSET" 
  944.   Else If C=25
  945.     Bset PV(2),PV(1)
  946.     VAR_SET[IV(1),PV(1)]
  947.     'Else If C$="BITCLR" 
  948.   Else If C=26
  949.     Bclr PV(2),PV(1)
  950.     VAR_SET[IV(1),PV(1)]
  951.     'Else If C$="BITCHG" 
  952.   Else If C=27
  953.     Bchg PV(2),PV(1)
  954.     VAR_SET[IV(1),PV(1)]
  955.     'Else If C$="BITGET" 
  956.   Else If C=28
  957.     VAR_SET[IV(3),Btst(PV(2),PV(1))]
  958.   End If 
  959.   'If C$="ADDITEM" 
  960.   If C=29
  961.     ITEM_ADD[PARSE$(1)-Chr$(34)]
  962.     'Else If C$="HAVEITEM" 
  963.   Else If C=30
  964.     ITEM_HAVE[PARSE$(1)-Chr$(34)] : A=Param
  965.     VAR_SET[IV(2),A]
  966.     'Else If C$="TAKEITEM" 
  967.   Else If C=31
  968.     ITEM_REMV[PARSE$(1)-Chr$(34)] : A=Param
  969.     VAR_SET[IV(2),A]
  970.     
  971.     'Else If C$="ITEMSPEC" 
  972.   Else If C=32
  973.     ITEM_STATS[PARSE$(1)-Chr$(34),PARSE$(2)-Chr$(34)] : A=Param
  974.     VAR_SET[IV(3),A]
  975.     'Else If C$="KILL" 
  976.   Else If C=33
  977.     Bob SCR_CURR,-50,-50,
  978.     'Else If C$="LOADLEVEL"
  979.   Else If C=34
  980.     LEVEL_LOADNOW$=PARSE$(1)
  981.     If SCR_PARSE=3
  982.       CONTROLLOCK=True
  983.       CHAR_XPOS=PV(2)
  984.       CHAR_YPOS=PV(3)
  985.       LEVEL_SKIPCHARXY=((PV(2)>-1) and(PV(3)>-1))
  986.     End If 
  987.     SCR_CURR=SCR_MAX
  988.     Pop 
  989.     Goto SUPERSKIP
  990.     'Else If C$="ITEMREMOVE" 
  991.   Else If C=35
  992.     A=Start(58)+768
  993.     Bset A+(PV(1) mod 8),A+(PV(1)/8)
  994.     'Else If C$="ITEMISGONE" 
  995.   Else If C=36
  996.     A=Start(58)+768
  997.     VAR_SET[IV(2),Btst(A+(PV(1) mod 8),A+(PV(1)/8))]
  998.     'Else If C$="ITEMKILL" 
  999.   Else If C=37
  1000.     A=Start(58)+768
  1001.     If Btst(A+(PV(1) mod 8),A+(PV(1)/8))
  1002.       Bob SCR_CURR,-50,-50,
  1003.     End If 
  1004.     'Else If C$="ITEMPUTBACK"
  1005.   Else If C=38
  1006.     A=Start(58)+768
  1007.     Bclr A+(PV(1) mod 8),A+(PV(1)/8)
  1008.     'Else If C$="ATTACK" 
  1009.   Else If C=39
  1010.     Repeat 
  1011.       DISPLAY_WAIT
  1012.     Until Not DISP_GO
  1013.     DISPLAY_CLOSE
  1014.     If SCR_PARSE=1
  1015.       FIGHT_SETUP[PV(1)]
  1016.     Else 
  1017.       SCRIPT_SCRGROUP[SCR_CURR] : WG=Param
  1018.       FIGHT_SETUP[WG]
  1019.     End If 
  1020.     'Else If C$="SOUND"
  1021.   Else If C=40
  1022.     PARSE$(1)=PARSE$(1)-Chr$(34)
  1023.     SOUND_PLAY[PARSE$(1),Val(PARSE$(3)),Val(PARSE$(2)),269]
  1024.     'Else If C$="BUY"
  1025.   Else If C=41
  1026.     PARSE$(1)=PARSE$(1)-Chr$(34)
  1027.     ITEM_WHICH[PARSE$(1)]
  1028.     If Param>0
  1029.       ITEM_STATS[PARSE$(1),"COST"] : CST=Param
  1030.       RATING_GET["CRED"] : CASH=Param
  1031.       If CASH=>CST
  1032.         CASH=CASH-CST
  1033.         ITEM_ADD[PARSE$(1)]
  1034.         RATING_SET["CRED",CASH]
  1035.         PV(2)=-1
  1036.       Else 
  1037.         PV(2)=0
  1038.       End If 
  1039.     Else 
  1040.       PV(2)=0
  1041.     End If 
  1042.     VAR_SET[IV(2),PV(2)]
  1043.     'Else If C$="SELL" 
  1044.   Else If C=42
  1045.     PARSE$(1)=PARSE$(1)-Chr$(34)
  1046.     ITEM_HAVE[PARSE$(1)]
  1047.     If Param
  1048.       ITEM_STATS[PARSE$(1),"COST"] : SELL=(Param*3)/4
  1049.       RATING_GET["CRED"] : CASH=Param+SELL
  1050.       RATING_SET["CRED",CASH]
  1051.       ITEM_REMV[PARSE$(1)]
  1052.       VAR_SET[IV(2),True]
  1053.     Else 
  1054.       VAR_SET[IV(2),False]
  1055.     End If 
  1056.     'Else If C$="COORDS" 
  1057.   Else If C=43
  1058.     '_IBOB_CHECK[PV(1)]
  1059.     'Trap A=I Bob(PV(1)) 
  1060.     'If A>0
  1061.     X=X Bob(PV(1))
  1062.     Y=Y Bob(PV(1))
  1063.     VAR_SET[IV(2),X]
  1064.     VAR_SET[IV(3),Y]
  1065.     'End If  
  1066.     'Else If C$="RATINGGET"
  1067.   Else If C=44
  1068.     RATING_GET[PARSE$(1)] : A=Param
  1069.     VAR_SET[IV(2),A]
  1070.     'Else If C$="RATINGSET"
  1071.   Else If C=45
  1072.     RATING_SET[PARSE$(1),PV(2)]
  1073.     'Else If C$="FADEOUT"
  1074.   Else If C=46
  1075.     CS=Screen : Screen 2
  1076.     Fade PV(1) : Screen CS
  1077.     Wait PV(1)*15
  1078.     BLACKSCREEN=True
  1079.     'Else If C$="FADEIN" 
  1080.   Else If C=47
  1081.     CS=Screen : Screen 2
  1082.     Fade PV(1) To 0 : Screen CS
  1083.     Wait PV(1)*15
  1084.     BLACKSCREEN=False
  1085.     'Else If C$="LOCKCONTROLS" 
  1086.   Else If C=48
  1087.     CONTROLLOCK=True
  1088.     WALKTHRUWALLS=(PV(1)=1)
  1089.     'Else If C$="UNLOCKCONTROLS" 
  1090.   Else If C=49
  1091.     CONTROLLOCK=False
  1092.     WALKTHRUWALLS=False
  1093.     'Else If C$="[" or C$="]"
  1094.   Else If C=50 or C=51
  1095.     If C=51
  1096.       M$="!"+(PARSE$(1)-Chr$(34))
  1097.       J$=PARSE$(2)
  1098.     Else 
  1099.       M$=PARSE$(1)-Chr$(34) : J$=""
  1100.       
  1101.       If SCR_PARSE=0
  1102.         If TXT_POS>0
  1103.           DISP_GO=True
  1104.           DISPLAY_FIGOPTIONS
  1105.           DISPLAY_TEXT
  1106.           Repeat 
  1107.             DISPLAY_WAIT
  1108.           Until Not DISP_GO
  1109.         End If 
  1110.         TXT_POS=0
  1111.       Else 
  1112.         If SCR_PARSE>1
  1113.           For I=2 To SCR_PARSE
  1114.             TXT_REPLACE[M$,"%"+(Str$(I-1)-" "),Str$(PV(I))-" "]
  1115.             M$=Param$
  1116.           Next 
  1117.         End If 
  1118.         TXT_REPLACE[M$,"%n",CHAR_NAME$] : M$=Param$
  1119.       End If 
  1120.     End If 
  1121.     
  1122.     If TXT_GRAB=-1
  1123.       If SCR_PARSE>0
  1124.         TXT_GRAB=SCR_CURR : TXT_POS=0
  1125.         DISPLAY$(TXT_POS)=M$ : DISP_GO=False
  1126.         DISPLAY_JUMP$(TXT_POS)=J$
  1127.         ISGRAB=True
  1128.         Inc TXT_POS
  1129.       End If 
  1130.     Else If TXT_GRAB=SCR_CURR
  1131.       If SCR_PARSE>0
  1132.         DISPLAY$(TXT_POS)=M$
  1133.         DISPLAY_JUMP$(TXT_POS)=J$
  1134.         ISGRAB=True
  1135.         Inc TXT_POS
  1136.       End If 
  1137.     End If 
  1138.   Else If C=53
  1139.     'PlayMod 
  1140.     A$="mods/"+PARSE$(1)
  1141.     If Exist(A$)=True
  1142.       NEWMOD$=Upper$(A$)
  1143.     End If 
  1144.     
  1145.     If Not MUS_NOPLAY
  1146.       If NEWMOD$<>CURRMOD$
  1147.         For I=63 To 0 Step -4
  1148.           Ptm Volume I : Wait Vbl 
  1149.         Next 
  1150.         Ptm Stop : Erase 33
  1151.         If NEWMOD$<>""
  1152.           If Not Exist("RPG:"+NEWMOD$)
  1153.             INEXT_ERROR["Unable to find MOD File",NEWMOD$,"In Mods Directory"]
  1154.           End If 
  1155.           Ptm Load "RPG:"+NEWMOD$,33 : Ptm Volume 63
  1156.           Ptm Play 33
  1157.         End If 
  1158.         CURRMOD$=NEWMOD$
  1159.       End If 
  1160.     End If 
  1161.     
  1162.     'CHANGENAME
  1163.   Else If C=54
  1164.     CHAR_NAME$=PARSE$(1)
  1165.     'QUAKE AMIGA 
  1166.   Else If C=56
  1167.     T=Timer+PV(1)*60
  1168.     Repeat 
  1169.       X=Rnd(4)-2
  1170.       Y=Rnd(4)-2
  1171.       Screen Display 2,128+X,50+Y,,
  1172.       Wait Vbl 
  1173.     Until Timer>T
  1174.     Screen Display 2,128,50,,
  1175.   Else If C=57
  1176.     CS=Screen : Screen 2
  1177.     Fade 2 : Screen CS
  1178.     Wait 30
  1179.     CREDITS[PV(1)]
  1180.     IMDEAD=True
  1181.   End If 
  1182.   If(C<>16) and(C<>52) and(C<>13) : SCRIPT_CURRCOMMAND(SCR_CURR,0)=-1 : End If 
  1183.   Return 
  1184. End Proc
  1185. Procedure SCRIPT_GETCMND[PTR]
  1186.   On Error Proc INEXT_ERRORTRAP
  1187.   A=Hunt(PTR To SCR_END,"|")
  1188.   If A=0
  1189.     SCR_EOF=True
  1190.     Goto __STOPSCR
  1191.   Else 
  1192.     SCR_EOF=False
  1193.     A$=Lstr(PTR,A-PTR) : A=A+1
  1194.     SCR_PARSE=Lwords(A$)-1
  1195.     For I=0 To SCR_PARSE
  1196.       PARSE$(I)=Lword(I+1,A$)
  1197.     Next 
  1198.   End If 
  1199.   __STOPSCR:
  1200. End Proc[A]
  1201. Procedure SCRIPT_JUMP[SCRIPT,LABEL$]
  1202.   On Error Proc INEXT_ERRORTRAP
  1203.   HSCR_START=Start(70)+Leek(DAT_SCR+(SCRIPT*12))
  1204.   HSCR_END=HSCR_START+Leek(DAT_SCR+(SCRIPT*12)+4)
  1205.   
  1206.   If HSCR_START<>HSCR_END
  1207.     If Not TCH(SCRIPT)
  1208.       LABEL$=":"+LABEL$
  1209.       A=Hunt(HSCR_START To HSCR_END,LABEL$)
  1210.       If A>0
  1211.         Loke DAT_SCR+(SCRIPT*12)+8,(A+Len(LABEL$)+1)-HSCR_START
  1212.         SCRIPT_CURRCOMMAND(SCRIPT,0)=-1
  1213.       End If 
  1214.     End If 
  1215.   End If 
  1216. End Proc
  1217.  
  1218. Procedure VAR_SET[N,V]
  1219.   On Error Proc INEXT_ERRORTRAP
  1220.   If N>-1
  1221.     Loke DAT_VARS+SCR_CURR*256+N*4,V
  1222.   End If 
  1223. End Proc
  1224. Procedure VAR_GET[N]
  1225.   On Error Proc INEXT_ERRORTRAP
  1226. End Proc[Leek(Start(68)+SCR_CURR*256+N*4)]
  1227. Procedure GLOVAR_PREP
  1228.   On Error Proc INEXT_ERRORTRAP
  1229.   Reserve As Work 58,1024
  1230. End Proc
  1231. Procedure GLOVAR_SET[N,V]
  1232.   On Error Proc INEXT_ERRORTRAP
  1233.   Loke Start(58)+N*4,V
  1234. End Proc
  1235. Procedure GLOVAR_GET[N]
  1236.   On Error Proc INEXT_ERRORTRAP
  1237. End Proc[Leek(Start(58)+N*4)]
  1238.  
  1239. Procedure MAP_FRONTSCREEN
  1240.   On Error Proc INEXT_ERRORTRAP
  1241.   Shared FRONT_ISOPEN
  1242.   If Not FRONT_ISOPEN
  1243.     Screen Open 2,320,200,64,Lowres : Flash Off : Curs Off : Cls 0
  1244.     Double Buffer : Autoback 0 : Gr Writing 0
  1245.     For I=0 To 31 : Colour I,0 : Next 
  1246.     FRONT_ISOPEN=True
  1247.     Screen 0
  1248.   End If 
  1249. End Proc
  1250. Procedure MAP_FRONTFADEIN
  1251.   On Error Proc INEXT_ERRORTRAP
  1252.   Shared FRONT_ISOPEN
  1253.   If FRONT_ISOPEN
  1254.     BLACKSCREEN=False
  1255.     S=Screen
  1256.     MAP_DISPLAY
  1257.     Screen 2
  1258.     Fade 3 To 0 : Wait 45
  1259.     FONT_FIND["XEN.font/8"]
  1260.     Set Font Param
  1261.     Screen S
  1262.   End If 
  1263. End Proc
  1264. Procedure MAP_SCREENLOAD[FILE$]
  1265.   On Error Proc INEXT_ERRORTRAP
  1266.   XPK_BANKUNPACK[FILE$,14]
  1267.   Unpack 14 To 0 : Screen Hide 0
  1268.   Erase 14
  1269.   
  1270.   Priority On 
  1271.   Priority Reverse Off 
  1272.   Bob Update Off 
  1273.   
  1274.   MAP_ZONERESET
  1275.   SW=Screen Width-1 : SH=Screen Height-1 : SC=Screen Colour
  1276.   
  1277.   MAP_FRONTCLOSE
  1278.   MAP_FRONTSCREEN
  1279.   
  1280.   DX=CHAR_XPOS-160 : DY=CHAR_YPOS-100
  1281.   If DX>SW-320 : DX=SW-320 : End If 
  1282.   If DX<0 : DX=0 : End If 
  1283.   If DY>SH-200 : DY=SH-200 : End If 
  1284.   If DY<0 : DY=0 : End If 
  1285.   
  1286.   MAP_WIDTH=SW : MAP_HEIGHT=SH
  1287.   MAP_XPOS=DX : MAP_YPOS=DY
  1288.   Screen 0
  1289. End Proc
  1290. Procedure MAP_DISPLAY
  1291.   'On Error Proc INEXT_ERRORTRAP 
  1292.   SC=Screen
  1293.   Bob Clear : Bob Draw 
  1294.   MAP_XPOS=CHAR_XPOS-160
  1295.   MAP_YPOS=CHAR_YPOS-100
  1296.   If MAP_XPOS+320>MAP_WIDTH : MAP_XPOS=MAP_WIDTH-320 : End If 
  1297.   If MAP_XPOS<0 : MAP_XPOS=0 : End If 
  1298.   If MAP_YPOS+200>MAP_HEIGHT : MAP_YPOS=MAP_HEIGHT-200 : End If 
  1299.   If MAP_YPOS<0 : MAP_YPOS=0 : End If 
  1300.   
  1301.   If DISPLAY_SHOW
  1302.     Screen Copy 0,MAP_XPOS,MAP_YPOS,MAP_XPOS+320,MAP_YPOS+200 To 2,0,0
  1303.     EFFECT_LAYDOWN
  1304.     Screen Swap : Wait Vbl 
  1305.   End If 
  1306.   Screen SC
  1307. End Proc
  1308. Procedure MAP_OFFSETFIX[X,Y]
  1309.   On Error Proc INEXT_ERRORTRAP
  1310.   MAP_XPOS=X-160
  1311.   MAP_YPOS=Y-100
  1312.   If MAP_XPOS+320>MAP_WIDTH : MAP_XPOS=MAP_WIDTH-320 : End If 
  1313.   If MAP_XPOS<0 : MAP_XPOS=0 : End If 
  1314.   If MAP_YPOS+200>MAP_HEIGHT : MAP_YPOS=MAP_HEIGHT-200 : End If 
  1315.   If MAP_YPOS<0 : MAP_YPOS=0 : End If 
  1316. End Proc
  1317. Procedure MAP_FRONTCLOSE
  1318.   On Error Proc INEXT_ERRORTRAP
  1319.   Shared FRONT_ISOPEN
  1320.   If FRONT_ISOPEN
  1321.     BLACKSCREEN=True
  1322.     Screen 2 : Fade 3 : Wait 45
  1323.     Screen Close 2
  1324.     FRONT_ISOPEN=False
  1325.     Screen 0
  1326.   End If 
  1327. End Proc
  1328.  
  1329. Procedure EFFECT_SETUP
  1330.   On Error Proc INEXT_ERRORTRAP
  1331.   If EFFECT_SETTINGS(0)>0
  1332.     KB=True
  1333.     CF=EFFECT_SETTINGS(0)
  1334.     S=Screen
  1335.     Screen Open 5,320,200,32,Lowres : Curs Off : Cls 0
  1336.     Screen Hide 5
  1337.     If CF=1
  1338.       Screen 0
  1339.       For I=0 To 31
  1340.         E=0 : Z=1 : A=Colour(I)
  1341.         For J=0 To 2
  1342.           E=E+Max((((A/Z) and 15)-2)*Z,0) : Z=Z*16
  1343.         Next 
  1344.         Colour I,E
  1345.       Next 
  1346.       Screen 5
  1347.       For I=1 To EFFECT_SETTINGS(1)
  1348.         X=Rnd(320) : Y=Rnd(200)
  1349.         Ink EFFECT_COLORS(0,2) : Draw X,Y To X,Y+3
  1350.         Ink EFFECT_COLORS(0,1) : Plot X,Y+4
  1351.         Ink EFFECT_COLORS(0,0) : Plot X,Y+5
  1352.       Next 
  1353.       EFFECT_SETTINGS(9)=0
  1354.     Else If CF=2
  1355.       Screen 0
  1356.       For I=0 To 31
  1357.         E=0 : Z=1 : A=Colour(I)
  1358.         For J=0 To 2
  1359.           E=E+Min((((A/Z) and 15)+1),15)*Z : Z=Z*16
  1360.         Next 
  1361.         Colour I,E
  1362.       Next 
  1363.       Screen 5
  1364.       For I=1 To EFFECT_SETTINGS(1)
  1365.         X=Rnd(320) : Y=Rnd(200)
  1366.         Ink EFFECT_COLORS(1,0) : Box X,Y To X+1,Y+1
  1367.         Ink EFFECT_COLORS(1,1) : Plot X,Y+1
  1368.         Ink EFFECT_COLORS(1,2) : Plot X+1,Y
  1369.       Next 
  1370.       EFFECT_SETTINGS(9)=0
  1371.     Else If CF=3
  1372.       KB=False
  1373.       CS=Start(45)
  1374.       EFFECT_SETTINGS(9)=0
  1375.       Screen 0
  1376.       For I=0 To 31
  1377.         E=0 : Z=1 : A=Colour(I)
  1378.         For J=0 To 2
  1379.           E=E+Max((((A/Z) and 15)-4),0)*Z : Z=Z*16
  1380.         Next 
  1381.         Doke CS,E : CS=CS+2
  1382.       Next 
  1383.     Else If CF=4
  1384.       KB=False
  1385.       CS=Start(45)
  1386.       EFFECT_SETTINGS(9)=0
  1387.       Screen 0
  1388.       For I=0 To 31
  1389.         E=0 : F=0 : Z=1 : A=Colour(I)
  1390.         For J=0 To 2
  1391.           F=F+Max((((A/Z) and 15)-2),0)*Z
  1392.           E=E+Min((((A/Z) and 15)+4),15)*Z : Z=Z*16
  1393.         Next 
  1394.         Doke CS,E : CS=CS+2 : Colour I,F
  1395.       Next 
  1396.     Else If CF=5
  1397.       Screen 0
  1398.       SC=Screen Colour-1
  1399.       MX=200 : MZ=-1
  1400.       For I=1 To SC
  1401.         A=Colour(I) : Z=1 : E=0
  1402.         For J=0 To 2
  1403.           E=E+((A/Z) and 15)
  1404.           Z=Z*16
  1405.         Next 
  1406.         If E<MX : MX=E : MZ=I : End If 
  1407.       Next 
  1408.       Screen 5
  1409.       Ink MZ
  1410.       Gr Writing 0
  1411.       For I=8 To 0 Step -1
  1412.         XD=(I*120)/8+40
  1413.         YD=(I*60)/8+40
  1414.         If I=0
  1415.           P=1
  1416.         Else If I=8
  1417.           P=0
  1418.         Else 
  1419.           P=I+27
  1420.         End If 
  1421.         Set Pattern P
  1422.         Cls 0,160-XD,100-YD To 160+XD,100+YD
  1423.         Ink MZ,0 : Bar 160-XD,100-YD To 160+XD,100+YD
  1424.       Next 
  1425.     Else If CF=99
  1426.       XPK_BANKUNPACK["RPG:Maps/effect"+(Str$(EFFECT_SETTINGS(1))-" ")+".spk",29]
  1427.       Unpack 29 To 5
  1428.       Erase 29
  1429.     End If 
  1430.     If KB
  1431.       Get Block 200,0,0,320,200,1
  1432.     End If 
  1433.     Screen Close 5
  1434.     Screen S
  1435.   End If 
  1436.   
  1437. End Proc
  1438. Procedure EFFECT_LAYDOWN
  1439.   'On Error Proc INEXT_ERRORTRAP 
  1440.   ST=Screen
  1441.   If EFFECT_SETTINGS(0)>0
  1442.     If EFFECT_SETTINGS(0)=1 or EFFECT_SETTINGS(0)=2
  1443.       Screen 2
  1444.       Put Block 200,0,EFFECT_SETTINGS(9)
  1445.       Put Block 200,0,EFFECT_SETTINGS(9)-200
  1446.       Screen 0
  1447.       EFFECT_SETTINGS(9)=(EFFECT_SETTINGS(9)+EFFECT_SETTINGS(2)) mod 200
  1448.     Else If EFFECT_SETTINGS(0)=5
  1449.       Screen 2
  1450.       Put Block 200,0,0
  1451.       Screen 0
  1452.     Else If EFFECT_SETTINGS(0)=99
  1453.       Screen 2
  1454.       Put Block 200,0,0
  1455.       Screen 0
  1456.     Else If EFFECT_SETTINGS(0)=3
  1457.       If Rnd(1)=0
  1458.         Screen 2
  1459.         If EFFECT_SETTINGS(9)
  1460.           Get Palette 0
  1461.         Else 
  1462.           S=Start(45)
  1463.           For I=0 To 31
  1464.             Colour I,Deek(S) : S=S+2
  1465.           Next 
  1466.         End If 
  1467.         Screen 0
  1468.         EFFECT_SETTINGS(9)= Not EFFECT_SETTINGS(9)
  1469.       End If 
  1470.     Else If EFFECT_SETTINGS(0)=4
  1471.       Screen 2
  1472.       If EFFECT_SETTINGS(9)
  1473.         Get Palette 0
  1474.         EFFECT_SETTINGS(9)=False
  1475.       Else 
  1476.         If Rnd(10)=0
  1477.           S=Start(45)
  1478.           For I=0 To 31
  1479.             Colour I,Deek(S) : S=S+2
  1480.           Next 
  1481.         End If 
  1482.         EFFECT_SETTINGS(9)=True
  1483.       End If 
  1484.       Screen 0
  1485.     End If 
  1486.   End If 
  1487.   Screen ST
  1488. End Proc
  1489.  
  1490. Procedure NEWMENU_ROUTINE
  1491.   On Error Proc INEXT_ERRORTRAP
  1492.   Repeat 
  1493.     NEWMENU_RESET
  1494.     NEWMENU_ADD["Equipment","Equipment and Inventory"]
  1495.     NEWMENU_ADD["Load/Save","Load or Save a Game"]
  1496.     NEWMENU_ADD["Stats","Statistics"]
  1497.     NEWMENU_ADD["Cancel","Return To Game"]
  1498.     NEWMENU_CHOICE
  1499.     C=Param
  1500.     If C<>3
  1501.       NEWMENU_RESET
  1502.       If C=0
  1503.         Repeat 
  1504.           NEWMENU_RESET
  1505.           NEWMENU_ADD["Equip","Equip A Weapon or Piece of Armor"]
  1506.           NEWMENU_ADD["Use","Use An Item"]
  1507.           NEWMENU_ADD["Main Menu","Return To Main Menu"]
  1508.           NEWMENU_CHOICE
  1509.           D=Param
  1510.           If D<>2
  1511.             If D=1
  1512.               MITEM=-1
  1513.               For I=5 To 261
  1514.                 If ITEMHAVE(I)>0
  1515.                   Inc MITEM
  1516.                 End If 
  1517.               Next 
  1518.               If MITEM>-1
  1519.                 VPOS=0
  1520.                 Repeat 
  1521.                   NEWMENU_RESET
  1522.                   SPOS=VPOS+5 : QPOS=VPOS
  1523.                   CI=0 : IPOS=SPOS
  1524.                   Repeat 
  1525.                     If ITEMHAVE(IPOS)>0
  1526.                       HP=Deek(Start(60)+ITEMHAVE(IPOS)*8+2)
  1527.                       NEWMENU_ADD[ITEMS$(ITEMHAVE(IPOS)),"Use "+ITEMS$(ITEMHAVE(IPOS))+" for"+Str$(HP)+" HP"]
  1528.                       MENU_VAR(CI)=IPOS
  1529.                       Inc CI
  1530.                     End If 
  1531.                     If CI<6 : Inc IPOS : End If 
  1532.                   Until IPOS=262 or CI=6
  1533.                   If CI=6 or VPOS>0
  1534.                     NEWMENU_ADD["More...","See More Items"]
  1535.                   End If 
  1536.                   NEWMENU_ADD["Cancel","Return To Equip Menu"]
  1537.                   NEWMENU_CHOICE
  1538.                   F=Param
  1539.                   If CI=6
  1540.                     If F=6
  1541.                       Add VPOS,6,0 To MITEM
  1542.                     Else If F<6
  1543.                       If Deek(Start(60)+ITEMHAVE(MENU_VAR(F))*8+6)=4
  1544.                         HP=Deek(Start(60)+ITEMHAVE(MENU_VAR(F))*8+4)
  1545.                         RATINGS(0)=Min(RATINGS(0)+HP,RATINGS(1))
  1546.                         ITEM_REMFROMSPOT[MENU_VAR(F)]
  1547.                         ITEM_REORG
  1548.                       End If 
  1549.                     End If 
  1550.                   Else 
  1551.                     If VPOS>0 and F=CI
  1552.                       VPOS=0
  1553.                     Else 
  1554.                       If F<CI
  1555.                         If Deek(Start(60)+ITEMHAVE(MENU_VAR(F))*8+6)=4
  1556.                           HP=Deek(Start(60)+ITEMHAVE(MENU_VAR(F))*8+4)
  1557.                           RATINGS(0)=Min(RATINGS(0)+HP,RATINGS(1))
  1558.                           ITEM_REMFROMSPOT[MENU_VAR(F)]
  1559.                           ITEM_REORG
  1560.                         End If 
  1561.                       End If 
  1562.                     End If 
  1563.                   End If 
  1564.                   T1=(QPOS=0) and(CI<6) and(CI=F)
  1565.                   T2=((QPOS>0) or(CI<6)) and(F=CI+1)
  1566.                   T3=(CI=6) and(F=CI+1)
  1567.                 Until T1 or T2 or T3
  1568.               End If 
  1569.             Else If D=0
  1570.               Repeat 
  1571.                 NEWMENU_RESET
  1572.                 NEWMENU_ADD["Weapon","Change From "+ITEMS$(ITEMHAVE(0))+" to Another Weapon"]
  1573.                 NEWMENU_ADD["Armor","Change From "+ITEMS$(ITEMHAVE(1))+" to Another Armor"]
  1574.                 NEWMENU_ADD["Gloves","Change From "+ITEMS$(ITEMHAVE(2))+" to Another Set Of Gloves"]
  1575.                 NEWMENU_ADD["Hat","Change From "+ITEMS$(ITEMHAVE(3))+" to Another Hat"]
  1576.                 NEWMENU_ADD["Cancel","Return To Equip Menu"]
  1577.                 NEWMENU_CHOICE
  1578.                 E=Param
  1579.                 If E<>4
  1580.                   VPOS=0 : MITEM=-1
  1581.                   For I=5 To 261
  1582.                     If ITEMHAVE(I)>0
  1583.                       ITN=ITEMHAVE(I)
  1584.                       T=Deek(Start(60)+ITN*8+6)
  1585.                       If T=E
  1586.                         Inc MITEM
  1587.                       End If 
  1588.                     End If 
  1589.                   Next 
  1590.                   If MITEM>-1
  1591.                     Repeat 
  1592.                       NEWMENU_RESET
  1593.                       Q=VPOS : SPOS=5 : QPOS=VPOS
  1594.                       Repeat 
  1595.                         If ITEMHAVE(SPOS)>0
  1596.                           T=Deek(Start(60)+ITEMHAVE(SPOS)*8+6)
  1597.                           If T=E
  1598.                             Dec Q
  1599.                           End If 
  1600.                         End If 
  1601.                         If Q>-1 : Inc SPOS : End If 
  1602.                       Until Q=-1 or SPOS=262
  1603.                       If SPOS=262 and Q>-1
  1604.                         Goto __OUTOFITEMS
  1605.                       End If 
  1606.                       CI=0 : IPOS=SPOS
  1607.                       Repeat 
  1608.                         If ITEMHAVE(IPOS)>0
  1609.                           T=Deek(Start(60)+ITEMHAVE(IPOS)*8+6)
  1610.                           If T=E
  1611.                             NEWMENU_ADD[ITEMS$(ITEMHAVE(IPOS)),"Switch To "+ITEMS$(ITEMHAVE(IPOS))]
  1612.                             MENU_VAR(CI)=IPOS
  1613.                             Inc CI
  1614.                           End If 
  1615.                         End If 
  1616.                         If CI<6 : Inc IPOS : End If 
  1617.                       Until IPOS=262 or CI=6
  1618.                       If CI=6 or VPOS>0
  1619.                         NEWMENU_ADD["More...","See More Items"]
  1620.                       End If 
  1621.                       NEWMENU_ADD["Cancel","Return To Equip Menu"]
  1622.                       NEWMENU_CHOICE
  1623.                       F=Param
  1624.                       If CI=6
  1625.                         If F=6
  1626.                           Add VPOS,6,0 To MITEM
  1627.                         Else If F<6
  1628.                           Swap ITEMHAVE(E),ITEMHAVE(MENU_VAR(F))
  1629.                         End If 
  1630.                       Else 
  1631.                         If VPOS>0 and F=CI
  1632.                           VPOS=0
  1633.                         Else 
  1634.                           If F<CI
  1635.                             Swap ITEMHAVE(E),ITEMHAVE(MENU_VAR(F))
  1636.                           End If 
  1637.                         End If 
  1638.                       End If 
  1639.                       T1=(QPOS=0) and(CI<6) and(CI=F)
  1640.                       T2=((QPOS>0) or(CI<6)) and(F=CI+1)
  1641.                       T3=(CI=6) and(F=CI+1)
  1642.                     Until T1 or T2 or T3
  1643.                   End If 
  1644.                   __OUTOFITEMS:
  1645.                 Until E=4
  1646.               End If 
  1647.             End If 
  1648.           End If 
  1649.         Until D=2
  1650.       Else If C=1
  1651.         NEWMENU_ADD["Load","Load A Game"]
  1652.         NEWMENU_ADD["Save","Save A Game"]
  1653.         NEWMENU_ADD["Main Menu","Return To Main Menu"]
  1654.         Repeat 
  1655.           NEWMENU_CHOICE
  1656.           D=Param
  1657.           If D=0
  1658.             Show On 
  1659.             FILE$=Fsel$("*.game","","Choose A Saved Game")
  1660.             Hide On 
  1661.             If FILE$<>"" : If Exist(FILE$)
  1662.                 GAME_LOAD[FILE$]
  1663.                 D=2 : C=3
  1664.             End If : End If 
  1665.           Else If D=1
  1666.             Show On 
  1667.             FILE$=Fsel$("*.game","","Enter A Name For Your Saved Game")
  1668.             Hide On 
  1669.             If FILE$<>""
  1670.               GAME_SAVE[FILE$]
  1671.             End If 
  1672.           End If 
  1673.         Until D=2
  1674.       Else If C=2
  1675.         NEWMENU_ADD["HP/MHP","HP:"+Str$(RATINGS(0))+"/"+Str$(RATINGS(1))]
  1676.         A$="Str:"+Str$(RATINGS(2))
  1677.         A$=A$+"  Dex:"+Str$(RATINGS(3))
  1678.         A$=A$+"  Int:"+Str$(RATINGS(4))
  1679.         NEWMENU_ADD["Str/Dex/Int",A$]
  1680.         NEWMENU_ADD["Credits",Str$(RATINGS(5))+" Credits"]
  1681.         A$=Str$(RATINGS(6))+"/"
  1682.         Proc RATING_NEXTUP : NUP=Param
  1683.         A$=A$+Str$(NUP)+" Experience to Next Level"
  1684.         NEWMENU_ADD["Exp",A$]
  1685.         Proc ITEM_CALCATTACK : AK=Param
  1686.         Proc ITEM_CALCDEFENSE : DF=Param
  1687.         A$="Attack:"+Str$(AK)
  1688.         A$=A$+"  Defence:"+Str$(DF)
  1689.         NEWMENU_ADD["Atk/Def",A$]
  1690.         NEWMENU_ADD["Main Menu","Return To Main Menu"]
  1691.         Repeat 
  1692.           NEWMENU_CHOICE
  1693.           D=Param
  1694.         Until D=5
  1695.       End If 
  1696.     End If 
  1697.   Until C=3
  1698. End Proc
  1699. Procedure NEWMENU_RESET
  1700.   On Error Proc INEXT_ERRORTRAP
  1701.   Shared MMENU
  1702.   MMENU=-1
  1703. End Proc
  1704. Procedure NEWMENU_ADD[S$,L$]
  1705.   On Error Proc INEXT_ERRORTRAP
  1706.   Shared MMENU
  1707.   Inc MMENU
  1708.   NEWMENU$(MMENU,0)=S$
  1709.   NEWMENU$(MMENU,1)=L$
  1710. End Proc
  1711. Procedure NEWMENU_CHOICE
  1712.   On Error Proc INEXT_ERRORTRAP
  1713.   Shared MMENU
  1714.   
  1715.   S=Screen
  1716.   Screen 2
  1717.   FONT_FIND["XEN.font/8"]
  1718.   Set Font Param
  1719.   Gr Writing 0
  1720.   
  1721.   SPEED=8
  1722.   
  1723.   MENU_XPOS=Min(Max(CHAR_XPOS-MAP_XPOS,80),240)
  1724.   MENU_YPOS=Min(Max(CHAR_YPOS-MAP_YPOS,60),130)
  1725.   
  1726.   DMENU=MMENU+1
  1727.   For I=0 To MMENU
  1728.     ANG=(I*360)/DMENU
  1729.     NEWMENU_POS(I,0)=MENU_XPOS+Sin(ANG)*50
  1730.     NEWMENU_POS(I,1)=MENU_YPOS-Cos(ANG)*50
  1731.   Next 
  1732.   CMENU=0
  1733.   
  1734.   For FRAMES=0 To SPEED
  1735.     Screen Copy 0,MAP_XPOS,MAP_YPOS,MAP_XPOS+320,MAP_YPOS+200 To 2,0,0
  1736.     
  1737.     For I=0 To MMENU
  1738.       CI=(CMENU+I) mod DMENU
  1739.       A=Text Length(NEWMENU$(CI,0))
  1740.       A=A/2
  1741.       
  1742.       XD=NEWMENU_POS(I,0)-MENU_XPOS
  1743.       YD=NEWMENU_POS(I,1)-MENU_YPOS
  1744.       
  1745.       XP=MENU_XPOS+(XD*FRAMES)/SPEED
  1746.       YP=MENU_YPOS+(YD*FRAMES)/SPEED
  1747.       
  1748.       DXP=XP-A-2 : CXP=XP+A+2
  1749.       Cls MENU_COLORS(0),DXP,YP-10 To CXP,YP+2
  1750.       Ink MENU_COLORS(1) : Polyline DXP,YP+2 To DXP,YP-10 To CXP,YP-10
  1751.       Ink MENU_COLORS(2) : Polyline DXP,YP+2 To CXP,YP+2 To CXP,YP-10
  1752.       Ink MENU_COLORS(3) : Text XP-A,YP-1,NEWMENU$(CI,0)
  1753.     Next 
  1754.     
  1755.     Cls MENU_COLORS(0),0,190 To 320,200
  1756.     Ink MENU_COLORS(1) : Polyline 0,190 To 319,190 To 319,199
  1757.     Ink MENU_COLORS(2) : Polyline 0,190 To 0,199 To 319,199
  1758.     Ink MENU_COLORS(3) : Text 2,197,NEWMENU$(OMENU,1)
  1759.     Screen Swap : Beam Wait VB_LINE
  1760.   Next 
  1761.   
  1762.   Repeat 
  1763.     Screen Copy 0,MAP_XPOS,MAP_YPOS,MAP_XPOS+320,MAP_YPOS+200 To 2,0,0
  1764.     
  1765.     For I=0 To MMENU
  1766.       CI=(CMENU+I) mod DMENU
  1767.       A=Text Length(NEWMENU$(CI,0))
  1768.       A=A/2
  1769.       
  1770.       XP=NEWMENU_POS(I,0) : YP=NEWMENU_POS(I,1)
  1771.       DXP=XP-A-2 : CXP=XP+A+2
  1772.       Cls MENU_COLORS(0),DXP,NEWMENU_POS(I,1)-10 To CXP,NEWMENU_POS(I,1)+2
  1773.       Ink MENU_COLORS(1) : Polyline DXP,YP+2 To DXP,YP-10 To CXP,YP-10
  1774.       Ink MENU_COLORS(2) : Polyline DXP,YP+2 To CXP,YP+2 To CXP,YP-10
  1775.       Ink MENU_COLORS(3) : Text NEWMENU_POS(I,0)-A,NEWMENU_POS(I,1)-1,NEWMENU$(CI,0)
  1776.     Next 
  1777.     
  1778.     Cls MENU_COLORS(0),0,190 To 320,200
  1779.     Ink MENU_COLORS(1) : Polyline 0,190 To 319,190 To 319,199
  1780.     Ink MENU_COLORS(2) : Polyline 0,190 To 0,199 To 319,199
  1781.     Ink MENU_COLORS(3) : Text 2,197,NEWMENU$(CMENU,1)
  1782.     
  1783.     Screen Swap : Beam Wait VB_LINE
  1784.     
  1785.     OMENU=CMENU
  1786.     Repeat 
  1787.       SNAPSHOT
  1788.       J=Joy(1)
  1789.       Multi Wait 
  1790.     Until J>0
  1791.     
  1792.     If Btst(2,J)
  1793.       Add CMENU,1,0 To MMENU
  1794.       D=1
  1795.     Else If Btst(3,J)
  1796.       Add CMENU,-1,0 To MMENU
  1797.       D=-1
  1798.     End If 
  1799.     Repeat : Until Joy(1)=0
  1800.     
  1801.     If OMENU<>CMENU
  1802.       For FRAMES=0 To SPEED
  1803.         Screen Copy 0,MAP_XPOS,MAP_YPOS,MAP_XPOS+320,MAP_YPOS+200 To 2,0,0
  1804.         For I=0 To MMENU
  1805.           NI=(D+I+DMENU) mod DMENU
  1806.           CI=(CMENU+I) mod DMENU
  1807.           A=Text Length(NEWMENU$(CI,0))
  1808.           A=A/2
  1809.           
  1810.           XD=NEWMENU_POS(I,0)-NEWMENU_POS(NI,0)
  1811.           YD=NEWMENU_POS(I,1)-NEWMENU_POS(NI,1)
  1812.           
  1813.           XP=NEWMENU_POS(NI,0)+(XD*FRAMES)/SPEED
  1814.           YP=NEWMENU_POS(NI,1)+(YD*FRAMES)/SPEED
  1815.           DXP=XP-A-2 : CXP=XP+A+2
  1816.           Cls MENU_COLORS(0),DXP,YP-10 To CXP,YP+2
  1817.           Ink MENU_COLORS(1) : Polyline DXP,YP+2 To DXP,YP-10 To CXP,YP-10
  1818.           Ink MENU_COLORS(2) : Polyline DXP,YP+2 To CXP,YP+2 To CXP,YP-10
  1819.           Ink MENU_COLORS(3) : Text XP-A,YP-1,NEWMENU$(CI,0)
  1820.         Next 
  1821.         Cls MENU_COLORS(0),0,190 To 320,200
  1822.         Ink MENU_COLORS(1) : Polyline 0,190 To 319,190 To 319,199
  1823.         Ink MENU_COLORS(2) : Polyline 0,190 To 0,199 To 319,199
  1824.         Ink MENU_COLORS(3) : Text 2,197,NEWMENU$(OMENU,1)
  1825.         Screen Swap : Beam Wait VB_LINE
  1826.       Next 
  1827.     End If 
  1828.     
  1829.   Until Btst(4,J)
  1830.   For FRAMES=SPEED To 0 Step -1
  1831.     Screen Copy 0,MAP_XPOS,MAP_YPOS,MAP_XPOS+320,MAP_YPOS+200 To 2,0,0
  1832.     For I=0 To MMENU
  1833.       CI=(CMENU+I) mod DMENU
  1834.       A=Text Length(NEWMENU$(CI,0))
  1835.       A=A/2
  1836.       
  1837.       XD=NEWMENU_POS(I,0)-MENU_XPOS
  1838.       YD=NEWMENU_POS(I,1)-MENU_YPOS
  1839.       
  1840.       XP=MENU_XPOS+(XD*FRAMES)/SPEED
  1841.       YP=MENU_YPOS+(YD*FRAMES)/SPEED
  1842.       DXP=XP-A-2 : CXP=XP+A+2
  1843.       Cls MENU_COLORS(0),DXP,YP-10 To CXP,YP+2
  1844.       Ink MENU_COLORS(1) : Polyline DXP,YP+2 To DXP,YP-10 To CXP,YP-10
  1845.       Ink MENU_COLORS(2) : Polyline DXP,YP+2 To CXP,YP+2 To CXP,YP-10
  1846.       Ink MENU_COLORS(3) : Text XP-A,YP-1,NEWMENU$(CI,0)
  1847.     Next 
  1848.     Ink MENU_COLORS(0) : Bar 0,190 To 320,200
  1849.     Ink MENU_COLORS(1) : Polyline 0,190 To 319,190 To 319,199
  1850.     Ink MENU_COLORS(2) : Polyline 0,190 To 0,199 To 319,199
  1851.     Ink MENU_COLORS(3) : Text 2,197,NEWMENU$(OMENU,1)
  1852.     Screen Swap : Beam Wait VB_LINE
  1853.   Next 
  1854.   Screen S
  1855. End Proc[CMENU]
  1856.  
  1857. Procedure CLR_SETUP
  1858.   On Error Proc INEXT_ERRORTRAP
  1859.   For I=0 To 3
  1860.     FIND_PEN[$111*(I*5)]
  1861.     MENU_COLORS(I)=Param
  1862.   Next 
  1863. End Proc
  1864.  
  1865. Procedure MAP_ZONERESET
  1866.   On Error Proc INEXT_ERRORTRAP
  1867.   Reserve Zone 256
  1868.   Reserve As Work 62,6000
  1869. End Proc
  1870. Procedure MAP_ZONESET[WHICH,X1,Y1,X2,Y2,TYPE]
  1871.   On Error Proc INEXT_ERRORTRAP
  1872.   If X1>X2 : Swap X1,X2 : End If 
  1873.   If Y1>Y2 : Swap Y1,Y2 : End If 
  1874.   X2=Min(X2,Screen Width-1)
  1875.   Y2=Min(Y2,Screen Height-1)
  1876.   _X1=X1 : _X2=X2 : _Y1=Y1 : _Y2=Y2 : _WHICH=WHICH
  1877.   Set Zone WHICH+1,X1,Y1 To X2,Y2
  1878.   Loke Start(62)+(WHICH*20),TYPE
  1879. End Proc
  1880. Procedure MAP_ZONESETVAR[WHICH,VAR,VL]
  1881.   On Error Proc INEXT_ERRORTRAP
  1882.   Loke Start(62)+(WHICH*20)+4+(VAR*4),VL
  1883. End Proc
  1884. Procedure MAP_ZONEGETVAR[WHICH,VAR]
  1885.   On Error Proc INEXT_ERRORTRAP
  1886. End Proc[Leek(Start(62)+(WHICH*20)+4+(VAR*4))]
  1887. Procedure MAP_ZONECHECK[X,Y]
  1888.   On Error Proc INEXT_ERRORTRAP
  1889.   ZNE_CHECKED=Zone(X,Y)-1
  1890.   If ZNE_CHECKED>-1
  1891.     T=Leek(Start(62)+ZNE_CHECKED*20)
  1892.   Else 
  1893.     T=-1
  1894.   End If 
  1895. End Proc[T]
  1896.  
  1897. Procedure CHAR_COLLIDE[DIST]
  1898.   On Error Proc INEXT_ERRORTRAP
  1899.   P=-1 : DX=DIST : DY=DIST
  1900.   If SCR_MAX>0
  1901.     For I=1 To SCR_MAX
  1902.       X=Abs(X Bob(I)-CHAR_XPOS)
  1903.       Y=Abs(Y Bob(I)-CHAR_YPOS)
  1904.       If X<DX and Y<DY
  1905.         DX=Min(X,DX) : DY=Min(Y,DY) : P=I
  1906.       End If 
  1907.     Next 
  1908.   End If 
  1909. End Proc[P]
  1910. Procedure CHAR_FACE[C1,C2]
  1911.   On Error Proc INEXT_ERRORTRAP
  1912.   NEWFRAME_CHANGE[C1] : A=Param
  1913.   NEWFRAME_CHANGE[C2] : A=(A or Param)
  1914.   If Not A
  1915.     CHAR_MOVEDIFF(C1,0)=X Bob(C1)+(X Bob(C1)-X Bob(C2))
  1916.     CHAR_MOVEDIFF(C1,1)=Y Bob(C1)+(Y Bob(C1)-Y Bob(C2))
  1917.     CHAR_MOVEDIFF[C1]
  1918.     CHAR_MOVEDIFF(C2,0)=X Bob(C2)+(X Bob(C2)-X Bob(C1))
  1919.     CHAR_MOVEDIFF(C2,1)=Y Bob(C2)+(Y Bob(C2)-Y Bob(C1))
  1920.     CHAR_MOVEDIFF[C2]
  1921.   End If 
  1922. End Proc
  1923.  
  1924. Procedure FONT_FIND[NAME$]
  1925.   On Error Proc INEXT_ERRORTRAP
  1926.   NAME$=Upper$(NAME$)
  1927.   Get Rom Fonts : S=1 : F=-1
  1928.   Repeat 
  1929.     If Font$(S)<>""
  1930.       A$=Upper$(Lword(1,Font$(S))+"/"+Lword(2,Font$(S)))
  1931.       If A$=NAME$ : F=S : SKIP=True : End If 
  1932.       S=S+1
  1933.     End If 
  1934.   Until SKIP or Font$(S)=""
  1935.   If Not SKIP
  1936.     Get Disc Fonts : S=1
  1937.     Repeat 
  1938.       If Font$(S)<>""
  1939.         A$=Upper$(Lword(1,Font$(S))+"/"+Lword(2,Font$(S)))
  1940.         If A$=NAME$ : F=S : SKIP=True : End If 
  1941.         S=S+1
  1942.       End If 
  1943.     Until SKIP or Font$(S)=""
  1944.   End If 
  1945. End Proc[F]
  1946. Procedure TXT_REPLACE[O$,S$,R$]
  1947.   On Error Proc INEXT_ERRORTRAP
  1948.   A=Instr(O$,S$)
  1949.   If A>0
  1950.     Repeat 
  1951.       O$=Left$(O$,A-1)+R$+Mid$(O$,A+Len(S$))
  1952.       A=Instr(O$,S$)
  1953.     Until A=0
  1954.   End If 
  1955. End Proc[O$]
  1956. Procedure FIND_PEN[CLR]
  1957.   On Error Proc INEXT_ERRORTRAP
  1958.   SC=Screen Colour-1
  1959.   MX=200 : MZ=-1
  1960.   For I=0 To SC
  1961.     A=Colour(I) : Z=1 : E=0
  1962.     For J=0 To 2
  1963.       E=E+Abs(((A/Z) and 15)-((CLR/Z) and 15))
  1964.       Z=Z*16
  1965.     Next 
  1966.     If E<MX : MX=E : MZ=I : End If 
  1967.   Next 
  1968. End Proc[MZ]
  1969.  
  1970. Procedure DISPLAY_OPEN
  1971.   On Error Proc INEXT_ERRORTRAP
  1972.   If DISP_ISOPEN=False
  1973.     S=Screen
  1974.     Screen 2
  1975.     FONT_FIND["helvetica.font/15"]
  1976.     Set Font Param
  1977.     Set Text 2
  1978.     Gr Writing 0
  1979.     DISP_ISOPEN=True
  1980.     Screen S
  1981.   End If 
  1982. End Proc
  1983. Procedure DISPLAY_CLOSE
  1984.   On Error Proc INEXT_ERRORTRAP
  1985.   
  1986.   If DISP_ISOPEN=True
  1987.     DISP_ISOPEN=False
  1988.     Screen S
  1989.   End If 
  1990. End Proc
  1991. Procedure DISPLAY_FIGOPTIONS
  1992.   On Error Proc INEXT_ERRORTRAP
  1993.   DISP_OPTION=-1
  1994.   For I=0 To TXT_POS-1
  1995.     If Left$(DISPLAY$(I),1)="!"
  1996.       DISP_OPTION=I : I=TXT_POS
  1997.     End If 
  1998.   Next 
  1999. End Proc
  2000. Procedure DISPLAY_TEXT
  2001.   On Error Proc INEXT_ERRORTRAP
  2002.   If Not DISP_ISOPEN
  2003.     DISPLAY_OPEN
  2004.   End If 
  2005.   S=Screen : Screen 2
  2006.   Screen Copy 0,MAP_XPOS,MAP_YPOS,MAP_XPOS+320,MAP_YPOS+200 To 2,0,0
  2007.   EFFECT_LAYDOWN
  2008.   BY=(TXT_POS-1)*19+24
  2009.   Gr Writing 1 : Ink MENU_COLORS(0),MENU_COLORS(1)
  2010.   Set Pattern 32
  2011.   Bar 0,0 To 320,BY
  2012.   Set Pattern 0
  2013.   Gr Writing 0
  2014.   Ink MENU_COLORS(1) : Box 0,0 To 319,BY
  2015.   Ink MENU_COLORS(2) : Polyline 0,BY To 0,0 To 320,0
  2016.   For I=0 To TXT_POS-1
  2017.     D=(I*19)+16
  2018.     If Left$(DISPLAY$(I),1)="!"
  2019.       X=24 : A$=Mid$(DISPLAY$(I),2)
  2020.     Else 
  2021.       X=4 : A$=DISPLAY$(I)
  2022.     End If 
  2023.     Ink MENU_COLORS(2) : Text X-1,D,A$
  2024.     Ink MENU_COLORS(1) : Text X+1,D,A$
  2025.     Ink MENU_COLORS(3) : Text X,D,A$
  2026.     If I=DISP_OPTION
  2027.       DPOINTER[5,D-15]
  2028.     End If 
  2029.   Next 
  2030.   Screen Swap : Beam Wait VB_LINE
  2031.   Screen S
  2032. End Proc
  2033. Procedure DISPLAY_WAIT
  2034.   On Error Proc INEXT_ERRORTRAP
  2035.   If DISP_GO
  2036.     SNAPSHOT
  2037.     If(DISP_OPTION>-1) and(Joy(1) and 3)<>0
  2038.       If Jup(1) : M=-1 : End If 
  2039.       If Jdown(1) : M=1 : End If 
  2040.       Repeat 
  2041.         Add DISP_OPTION,M,0 To TXT_POS-1
  2042.       Until Left$(DISPLAY$(DISP_OPTION),1)="!"
  2043.       DISPLAY_TEXT
  2044.       Repeat : Until Joy(1)=0
  2045.     End If 
  2046.     If Fire(1)
  2047.       If DISP_OPTION>-1
  2048.         SCRIPT_JUMP[TXT_GRAB,DISPLAY_JUMP$(DISP_OPTION)]
  2049.       End If 
  2050.       DISP_GO=False : TXT_POS=0
  2051.       Repeat : Until Fire(1)=True
  2052.       Repeat : Until Fire(1)=False
  2053.     End If 
  2054.   End If 
  2055. End Proc
  2056.  
  2057. Procedure AA_FONT[X,Y,TXT$]
  2058.   On Error Proc INEXT_ERRORTRAP
  2059.   Ink MENU_COLORS(1) : Text X-1,Y,TXT$
  2060.   Ink MENU_COLORS(2) : Text X+1,Y,TXT$
  2061.   Ink MENU_COLORS(3) : Text X,Y,TXT$
  2062. End Proc
  2063. Procedure AA_REVFONT[X,Y,TXT$]
  2064.   On Error Proc INEXT_ERRORTRAP
  2065.   Ink MENU_COLORS(1) : Text X-1,Y,TXT$
  2066.   Ink MENU_COLORS(2) : Text X+1,Y,TXT$
  2067.   Ink MENU_COLORS(0) : Text X,Y,TXT$
  2068. End Proc
  2069. Procedure AA_BOX[X1,Y1,X2,Y2]
  2070.   On Error Proc INEXT_ERRORTRAP
  2071.   Ink MENU_COLORS(1) : Box X1,Y1 To X2,Y2
  2072.   Box X1+1,Y1+1 To X2-1,Y2-1
  2073.   Ink MENU_COLORS(2) : Polyline X1,Y2 To X1,Y1 To X2,Y1
  2074.   Polyline X1+1,Y2-1 To X1+1,Y1+1 To X2-1,Y1+1
  2075. End Proc
  2076. Procedure AA_BAR[X1,Y1,X2,Y2]
  2077.   On Error Proc INEXT_ERRORTRAP
  2078.   Cls 2,X1,Y1 To X2,Y2
  2079.   AA_BOX[X1,Y1,X2,Y2]
  2080. End Proc
  2081.  
  2082. Procedure ITEM_CALCATTACK
  2083.   On Error Proc INEXT_ERRORTRAP
  2084.   ITEM_STATS[ITEMS$(ITEMHAVE(0)),"WEAPON"]
  2085.   A=Param+(RATINGS(2)/4)+(RATINGS(4)/8)
  2086. End Proc[A]
  2087. Procedure ITEM_CALCDEFENSE
  2088.   On Error Proc INEXT_ERRORTRAP
  2089.   ITEM_STATS[ITEMS$(ITEMHAVE(1)),"ARMOR"] : A=Param
  2090.   ITEM_STATS[ITEMS$(ITEMHAVE(2)),"ARMOR"] : A=A+Param
  2091.   ITEM_STATS[ITEMS$(ITEMHAVE(3)),"ARMOR"] : A=A+Param
  2092.   A=A+(RATINGS(3)/4)+(RATINGS(4)/8)
  2093. End Proc[A]
  2094. Procedure ITEM_PREP
  2095.   On Error Proc INEXT_ERRORTRAP
  2096.   Shared ITEM_CURR
  2097.   Reserve As Work 60,2048
  2098.   ITEMS$(0)="Nothing"
  2099.   ITEM_CURR=1
  2100.   Open In 3,"items.data"
  2101.   Set Input 10,-1
  2102.   Repeat 
  2103.     Line Input #3,A$
  2104.     If Lwords(A$)=6
  2105.       NAME$=Lword(1,A$)
  2106.       WP=Val(Lword(2,A$))
  2107.       AP=Val(Lword(3,A$))
  2108.       HP=Val(Lword(4,A$))
  2109.       CS=Val(Lword(5,A$))
  2110.       TYPE=Val(Lword(6,A$))
  2111.       ITEM_ADDNAME[NAME$,WP,AP,HP,CS,TYPE]
  2112.     End If 
  2113.   Until Eof(3)
  2114.   Close 3
  2115. End Proc
  2116. Procedure ITEM_ADDNAME[NAME$,WP,AP,HP,CS,TYPE]
  2117.   On Error Proc INEXT_ERRORTRAP
  2118.   Shared ITEM_CURR
  2119.   ITEMS$(ITEM_CURR)=NAME$
  2120.   S=Start(60)+(ITEM_CURR*8)
  2121.   Poke S,WP
  2122.   Poke S+1,AP
  2123.   Doke S+2,HP
  2124.   Doke S+4,CS
  2125.   Doke S+6,TYPE
  2126.   Inc ITEM_CURR
  2127. End Proc
  2128.  
  2129. Procedure ITEM_REORG
  2130.   On Error Proc INEXT_ERRORTRAP
  2131.   For I=260 To 5 Step -1
  2132.     If ITEMHAVE(I)>0
  2133.       S=I : I=5
  2134.     End If 
  2135.   Next 
  2136.   For I=5 To S
  2137.     If ITEMHAVE(I)=0
  2138.       For J=I+1 To 261
  2139.         ITEMHAVE(J-1)=ITEMHAVE(J)
  2140.       Next 
  2141.       ITEMHAVE(261)=0
  2142.     End If 
  2143.   Next 
  2144. End Proc
  2145. Procedure ITEM_WHICH[NAME$]
  2146.   On Error Proc INEXT_ERRORTRAP
  2147.   Shared ITEM_CURR
  2148.   NAME$=Upper$(NAME$) : RES=0
  2149.   For I=1 To ITEM_CURR-1
  2150.     If NAME$=Upper$(ITEMS$(I))
  2151.       RES=I : I=ITEM_CURR
  2152.     End If 
  2153.   Next 
  2154. End Proc[RES]
  2155.  
  2156. Procedure ITEM_INSPOT[SPOT]
  2157.   On Error Proc INEXT_ERRORTRAP
  2158. End Proc[ITEMS$(ITEMHAVE(SPOT))]
  2159. Procedure ITEM_REMFROMSPOT[SPOT]
  2160.   On Error Proc INEXT_ERRORTRAP
  2161.   A$=ITEMS$(ITEMHAVE(SPOT))
  2162.   ITEMHAVE(SPOT)=0
  2163. End Proc[A$]
  2164. Procedure ITEM_ADDTOSPOT[NAME$,SPOT]
  2165.   On Error Proc INEXT_ERRORTRAP
  2166.   ITEM_WHICH[NAME$] : WHICH=Param
  2167.   ITEMHAVE(SPOT)=WHICH
  2168. End Proc
  2169. Procedure ITEM_ADDNUMSPOT[NUM,SPOT]
  2170.   On Error Proc INEXT_ERRORTRAP
  2171.   ITEMHAVE(SPOT)=NUM
  2172. End Proc
  2173. Procedure ITEM_ADD[NAME$]
  2174.   On Error Proc INEXT_ERRORTRAP
  2175.   For I=5 To 261
  2176.     If ITEMHAVE(I)=0
  2177.       ITEM_WHICH[NAME$]
  2178.       ITEMHAVE(I)=Param : I=261
  2179.     End If 
  2180.   Next 
  2181. End Proc
  2182. Procedure ITEM_REMV[NAME$]
  2183.   On Error Proc INEXT_ERRORTRAP
  2184.   ITEM_WHICH[NAME$] : WHICH=Param
  2185.   For I=5 To 261
  2186.     If ITEMHAVE(I)=WHICH
  2187.       ITEMHAVE(I)=0 : I=261 : RES=True
  2188.     End If 
  2189.   Next 
  2190. End Proc[RES]
  2191. Procedure ITEM_HAVE[NAME$]
  2192.   On Error Proc INEXT_ERRORTRAP
  2193.   ITEM_WHICH[NAME$] : WHICH=Param
  2194.   For I=5 To 261
  2195.     If ITEMHAVE(I)=WHICH
  2196.       I=261 : RES=True
  2197.     End If 
  2198.   Next 
  2199. End Proc[RES]
  2200. Procedure ITEM_STATS[NAME$,WHICH$]
  2201.   On Error Proc INEXT_ERRORTRAP
  2202.   ITEM_WHICH[NAME$] : WHICH=Param
  2203.   A=0
  2204.   If WHICH>0
  2205.     WHICH=Start(60)+WHICH*8
  2206.     WHICH$=Upper$(WHICH$)
  2207.     If WHICH$="WEAPON"
  2208.       A=Peek(WHICH)
  2209.     Else If WHICH$="ARMOR"
  2210.       A=Peek(WHICH+1)
  2211.     Else If WHICH$="HP"
  2212.       A=Deek(WHICH+2)
  2213.     Else If WHICH$="COST"
  2214.       A=Deek(WHICH+4)
  2215.     Else If WHICH$="TYPE"
  2216.       A=Deek(WHICH+6)
  2217.     End If 
  2218.   End If 
  2219. End Proc[A]
  2220.  
  2221. Procedure RATING_ADD[NAME$,V]
  2222.   On Error Proc INEXT_ERRORTRAP
  2223.   NAME$=Upper$(NAME$)
  2224.   For I=0 To 5
  2225.     Read A$
  2226.     If A$=NAME$
  2227.       RATINGS(I)=RATINGS(I)+V
  2228.     End If 
  2229.   Next 
  2230.   Pop Proc
  2231.   Data "HP","MHP","STR","INT","DEX","CRED"
  2232. End Proc
  2233. Procedure RATING_SET[NAME$,V]
  2234.   On Error Proc INEXT_ERRORTRAP
  2235.   NAME$=Upper$(NAME$)
  2236.   For I=0 To 5
  2237.     Read A$
  2238.     If A$=NAME$
  2239.       RATINGS(I)=V
  2240.     End If 
  2241.   Next 
  2242.   Pop Proc
  2243.   Data "HP","MHP","STR","INT","DEX","CRED"
  2244. End Proc
  2245. Procedure RATING_GET[NAME$]
  2246.   On Error Proc INEXT_ERRORTRAP
  2247.   NAME$=Upper$(NAME$)
  2248.   For I=0 To 5
  2249.     Read A$
  2250.     If A$=NAME$
  2251.       V=RATINGS(I)
  2252.     End If 
  2253.   Next 
  2254.   Data "HP","MHP","STR","INT","DEX","CRED"
  2255. End Proc[V]
  2256. Procedure RATING_NEXTUP
  2257.   On Error Proc INEXT_ERRORTRAP
  2258.   NXTUP=(RATINGS(1)*1.2)+(RATINGS(2)+RATINGS(3)+RATINGS(4)-15)*12
  2259. End Proc[NXTUP]
  2260.  
  2261. Procedure FIGHT_SETUP[GROUP]
  2262.   On Error Proc INEXT_ERRORTRAP
  2263.   Shared ENEMY_CURRMARK,NOKILL,ENEMY_GROUP
  2264.   SCRIPT_GETGROUP[GROUP]
  2265.   If ENEMY_MAX>-1
  2266.     ENEMY_GROUP=GROUP/10
  2267.     NOKILL=(GROUP>99)
  2268.     ENEMY_CURRMARK=-1
  2269.     Reserve As Work 65,(ENEMY_MAX+2)*16
  2270.     POS_START=Start(65)
  2271.     NEWFRAME_RESET
  2272.     For I=0 To ENEMY_MAX
  2273.       ANG=(I*360)/(ENEMY_MAX+1)
  2274.       DX=CHAR_XPOS+Sin(ANG)*50
  2275.       DY=CHAR_YPOS-Cos(ANG)*50
  2276.       WE=FIGHT_ENEMIES(I)
  2277.       Loke POS_START+(I*16),DX-X Bob(WE)
  2278.       Loke POS_START+(I*16)+4,DY-Y Bob(WE)
  2279.       Loke POS_START+(I*16)+8,X Bob(WE)
  2280.       Loke POS_START+(I*16)+12,Y Bob(WE)
  2281.       FIGHT_RESPONSE(I)=0
  2282.     Next 
  2283.     FIGHT_RESPONSE(16)=0
  2284.     NEWFRAME_SET[0,CHAR_FRAMEBASE(0)+4,False]
  2285.     For I=4 To 7
  2286.       NEWFRAME_GRABSET[CHAR_FRAMEBASE(0)+I]
  2287.     Next 
  2288.     For J=0 To ENEMY_MAX
  2289.       For K=4 To 7
  2290.         NEWFRAME_GRABSET[CHAR_FRAMEBASE(FIGHT_ENEMIES(J))+K]
  2291.       Next 
  2292.       NEWFRAME_SET[FIGHT_ENEMIES(J),CHAR_FRAMEBASE(FIGHT_ENEMIES(J))+6,False]
  2293.     Next 
  2294.     NEWFRAME_GRABSET[4090]
  2295.     NEWFRAME_FULLREQUEST
  2296.     For I=1 To 10
  2297.       HEI=Sin((I*180)/10)*20
  2298.       ALLDONE=True
  2299.       For J=0 To ENEMY_MAX
  2300.         BX=Leek(POS_START+J*16+8) : DX=Leek(POS_START+J*16)
  2301.         BY=Leek(POS_START+J*16+12) : DY=Leek(POS_START+J*16+4)
  2302.         
  2303.         PX=BX+(DX*I)/10
  2304.         PY=BY+(DY*I)/10-HEI
  2305.         
  2306.         Bob FIGHT_ENEMIES(J),PX,PY,
  2307.         'CHAR_MOVEDIFF[FIGHT_ENEMIES(J)] 
  2308.       Next 
  2309.       NEWFRAME_MOVE[0,False]
  2310.       MAP_DISPLAY
  2311.     Next 
  2312.     For J=0 To EMENY_MAX
  2313.       NEWFRAME_SET[FIGHT_ENEMIES(J),CHAR_FRAMEBASE(FIGHT_ENEMIES(J))+4,False]
  2314.     Next 
  2315.     Repeat 
  2316.       ALLDONE=True
  2317.       For J=0 To ENEMY_MAX
  2318.         NEWFRAME_MOVE[FIGHT_ENEMIES(J),False]
  2319.         ALLDONE=ALLDONE and Param
  2320.       Next 
  2321.       NEWFRAME_MOVE[0,False]
  2322.       ALLDONE=ALLDONE and Param
  2323.       MAP_DISPLAY
  2324.     Until ALLDONE
  2325.     
  2326.     'Fight Data
  2327.     'AABBCCCDD: AA (10000000) Attack 
  2328.     '           BB (100000)   Defense
  2329.     '           CCC
  2330.     
  2331.     CM=-1
  2332.     For J=0 To ENEMY_MAX
  2333.       FIGHT_ATTACK(J)=FIGHT_POWER(J)/10000000
  2334.       FIGHT_DEFENSE(J)=(FIGHT_POWER(J)/100000) mod 100
  2335.       FIGHT_HP(J)=(FIGHT_POWER(J)/100) mod 1000
  2336.       CM=Max(FIGHT_POWER(J) mod 100,CM)
  2337.     Next 
  2338.     RATING_GET["DEX"]
  2339.     FRSPEED=Param
  2340.     CM=Max(FRSPEED,CM)
  2341.     
  2342.     For J=0 To ENEMY_MAX
  2343.       FIGHT_CHARGE(J)=((FIGHT_POWER(J) mod 100)*15)/CM
  2344.     Next 
  2345.     FIGHT_CHARGE(16)=(FRSPEED*15)/CM
  2346.     
  2347.     For J=0 To ENEMY_MAX
  2348.       NEWFRAME_SET[FIGHT_ENEMIES(J),CHAR_FRAMEBASE(FIGHT_ENEMIES(J))+5,False]
  2349.     Next 
  2350.     NEWFRAME_SET[0,CHAR_FRAMEBASE(0)+5,False]
  2351.     MAP_DISPLAY
  2352.     
  2353.     SOUND_PLAY["RPG:Sounds/Fight.iff",15,8000,236]
  2354.     
  2355.     FIGHT_SCREENOPEN
  2356.     FIGHT
  2357.     FIGHT_SCREENCLOSE
  2358.   End If 
  2359. End Proc[ENEMY_MAX]
  2360. Procedure FIGHT_SCREENOPEN
  2361.   On Error Proc INEXT_ERRORTRAP
  2362.   S=Screen
  2363.   Screen 2
  2364.   FONT_FIND["XEN.font/8"]
  2365.   Set Font Param
  2366.   
  2367.   Screen Open 1,320,24,8,Lowres : Flash Off : Curs Off : Cls 0
  2368.   Screen Hide 1
  2369.   Double Buffer : Autoback 0
  2370.   FONT_FIND["XEN.font/8"]
  2371.   Set Font Param
  2372.   Gr Writing 0
  2373.   Palette $0,$111,$222,$333,$444,$555,$666,$FFF
  2374.   If CHAR_YPOS-MAP_YPOS<100
  2375.     Screen Display 1,,226,,0
  2376.   Else 
  2377.     Screen Display 1,,50,,0
  2378.   End If 
  2379.   FIGHT_SCREENUPDATE
  2380.   Screen Show 1
  2381.   For I=0 To 24 Step 4
  2382.     Screen Display 1,,,,I
  2383.     Beam Wait VB_LINE
  2384.   Next 
  2385.   Screen Display 1,,,,24
  2386.   FIGHT_ENEMYWHICH[0]
  2387.   Screen S
  2388. End Proc
  2389. Procedure FIGHT_SCREENCLOSE
  2390.   On Error Proc INEXT_ERRORTRAP
  2391.   For I=24 To 0 Step -4
  2392.     Screen Display 1,,,,I
  2393.     Beam Wait VB_LINE
  2394.   Next 
  2395.   Screen Close 1
  2396. End Proc
  2397. Procedure FIGHT_BACKDROP
  2398.   On Error Proc INEXT_ERRORTRAP
  2399.   For I=0 To 6
  2400.     Cls I,0,(I*24)/7 To 320,((I+1)*24)/7
  2401.   Next 
  2402. End Proc
  2403. Procedure FIGHT_SCREENUPDATE
  2404.   On Error Proc INEXT_ERRORTRAP
  2405.   Shared FIGHT_CURROPTION
  2406.   S=Screen : Screen 1
  2407.   FIGHT_BACKDROP
  2408.   If FIGHT_CURROPTION=0
  2409.     A$="Attack"
  2410.   Else If FIGHT_CURROPTION=1
  2411.     A$="LightHeal"
  2412.   Else If FIGHT_CURROPTION=2
  2413.     A$="SmartHeal"
  2414.   Else 
  2415.     A$="MaxHeal"
  2416.   End If 
  2417.   If FIGHT_RESPONSE(16)=150
  2418.     AA_FONT[2,16,A$]
  2419.   Else 
  2420.     AA_REVFONT[2,16,A$]
  2421.   End If 
  2422.   Cls 0,84,8 To 160,16
  2423.   Cls 7,84,8 To 84+(FIGHT_RESPONSE(16)*76)/150,16
  2424.   AA_BOX[84,8,160,16]
  2425.   
  2426.   RATING_GET["HP"] : HP=Param
  2427.   RATING_GET["MHP"] : MHP=Param
  2428.   A$="HP:"+(Str$(HP)-" ")+"/"+(Str$(MHP)-" ")
  2429.   AA_FONT[180,16,A$]
  2430.   Screen Copy Logic(1) To Physic(1) : Wait Vbl 
  2431.   Screen S
  2432. End Proc
  2433.  
  2434. Procedure FIGHT_TEXT[TXT$]
  2435.   On Error Proc INEXT_ERRORTRAP
  2436.   S=Screen : Screen 1
  2437.   FIGHT_BACKDROP
  2438.   AA_FONT[4,16,TXT$]
  2439.   Screen Copy Logic To Physic : Beam Wait VB_LINE
  2440.   Screen S
  2441. End Proc
  2442. Procedure FIGHT
  2443.   On Error Proc INEXT_ERRORTRAP
  2444.   Shared ENEMY_CURRMARK,FIGHT_CURROPTION,NOKILL,ENEMY_GROUP
  2445.   Shared _ATTACK,_DEFENSE
  2446.   FIGHT_END=False
  2447.   RATING_GET["DEX"]
  2448.   FRSPEED=Param
  2449.   
  2450.   RATING_GET["INT"]
  2451.   SMARTS=Param
  2452.   
  2453.   Proc ITEM_CALCATTACK : _ATTACK=Param
  2454.   Proc ITEM_CALCDEFENSE : _DEFENSE=Param
  2455.   CASH=0
  2456.   
  2457.   FIGHT_CURROPTION=0
  2458.   FS_POS=((CHAR_YPOS-MAP_YPOS)<100)
  2459.   
  2460.   For I=0 To 15
  2461.     HIT_PERCENT=Max(HIT_PERCENT,FIGHT_ATTACK(I)+FIGHT_DEFENSE(I))
  2462.   Next 
  2463.   HIT_PERCENT=Max(HIT_PERCENT,(_ATTACK+_DEFENSE))
  2464.   
  2465.   Do 
  2466.     If Key State(88)
  2467.       If Not FS_POS
  2468.         Screen Display 1,,226,,0
  2469.       Else 
  2470.         Screen Display 1,,50,,0
  2471.       End If 
  2472.       Repeat : Until Not Key State(88)
  2473.       FS_POS= Not FS_POS
  2474.     End If 
  2475.     If Jleft(1)
  2476.       D=ENEMY_CURRMARK
  2477.       Repeat 
  2478.         Add D,-1,0 To ENEMY_MAX
  2479.       Until FIGHT_HP(D)>0
  2480.       FIGHT_ENEMYWHICH[D]
  2481.     Else If Jright(1)
  2482.       D=ENEMY_CURRMARK
  2483.       Repeat 
  2484.         Add D,1,0 To ENEMY_MAX
  2485.       Until FIGHT_HP(D)>0
  2486.       FIGHT_ENEMYWHICH[D]
  2487.     Else If Jup(1)
  2488.       Add FIGHT_CURROPTION,-1,0 To 3
  2489.       JS_WAIT
  2490.     Else If Jdown(1)
  2491.       Add FIGHT_CURROPTION,1,0 To 3
  2492.       JS_WAIT
  2493.     Else If Fire(1) and FIGHT_RESPONSE(16)=150
  2494.       FIGHT_RESPONSE(16)=0
  2495.       If FIGHT_CURROPTION=0
  2496.         CE=ENEMY_CURRMARK
  2497.         FIGHT_ENEMYWHICH[-1]
  2498.         WB=FIGHT_ENEMIES(CE)
  2499.         DX=(X Bob(WB)-4)-CHAR_XPOS
  2500.         DY=(Y Bob(WB)+4)-CHAR_YPOS
  2501.         NEWFRAME_SET[0,CHAR_FRAMEBASE(0)+6,False] : OSET=Param
  2502.         
  2503.         For I=1 To 10
  2504.           HEI=Sin((I*180)/10)*20
  2505.           PX=CHAR_XPOS+(DX*I)/10
  2506.           PY=CHAR_YPOS+(DY*I)/10-HEI
  2507.           
  2508.           Bob 0,PX,PY,
  2509.           MAP_DISPLAY
  2510.         Next 
  2511.         
  2512.         HIT=_ATTACK+_DEFENSE
  2513.         If Rnd(HIT_PERCENT)<HIT
  2514.           YOUR_ATK=Rnd(0.2*_ATTACK)+(0.9*_ATTACK)
  2515.           If Rnd(10)=0
  2516.             YOUR_ATK=(YOUR_ATK*5)/4
  2517.             S=Screen : Screen 2
  2518.             For I=0 To 31
  2519.               Colour I,$FFF
  2520.             Next 
  2521.             Fade 2 To 0 : Screen S
  2522.           End If 
  2523.           
  2524.           DMG=YOUR_ATK-FIGHT_DEFENSE(CE)
  2525.           
  2526.           If DMG>0
  2527.             FIGHT_HP(CE)=FIGHT_HP(CE)-DMG
  2528.             A$=Str$(DMG)-" "
  2529.           Else 
  2530.             A=YOUR_ATK*0.1
  2531.             If A>0
  2532.               DMG=Max(1,Rnd(A))
  2533.             Else 
  2534.               DMG=1
  2535.             End If 
  2536.             FIGHT_HP(CE)=FIGHT_HP(CE)-DMG
  2537.             A$=Str$(DMG)-" "
  2538.           End If 
  2539.         Else 
  2540.           A$="Missed!"
  2541.         End If 
  2542.         
  2543.         NEWFRAME_SET[0,CHAR_FRAMEBASE(0)+7,False]
  2544.         SOUND_PLAY["RPG:Sounds/Fight0x.iff",15,8000,236]
  2545.         Repeat 
  2546.           MAP_DISPLAY
  2547.           NEWFRAME_MOVE[0,False]
  2548.         Until Param
  2549.         MAP_DISPLAY
  2550.         Wait 5
  2551.         NEWFRAME_SET[0,CHAR_FRAMEBASE(0)+6,False]
  2552.         
  2553.         For I=10 To 0 Step -1
  2554.           HEI=Sin((I*180)/10)*20
  2555.           PX=CHAR_XPOS+(DX*I)/10
  2556.           PY=CHAR_YPOS+(DY*I)/10-HEI
  2557.           
  2558.           Bob 0,PX,PY,
  2559.           MAP_DISPLAY
  2560.         Next 
  2561.         
  2562.         NEWFRAME_SET[0,OSET,False]
  2563.         MAP_DISPLAY
  2564.         
  2565.         FIGHT_NUMBERBOUNCE[CE,A$]
  2566.         
  2567.         If FIGHT_HP(CE)<1
  2568.           If Not NOKILL : Bob WB,-50,-50, : End If 
  2569.           RATINGS(6)=RATINGS(6)+(FIGHT_ATTACK(CE)+FIGHT_DEFENSE(CE))
  2570.           CASH=CASH+Rnd(FIGHT_ATTACK(CE)+FIGHT_DEFENSE(CE))+2
  2571.           MAP_DISPLAY
  2572.           EDCNT=0
  2573.           Repeat 
  2574.             Add CE,1,0 To ENEMY_MAX
  2575.             If FIGHT_HP(CE)<1 : Inc EDCNT : End If 
  2576.           Until FIGHT_HP(CE)>0 or EDCNT=>ENEMY_MAX
  2577.           If EDCNT=>ENEMY_MAX
  2578.             Goto __BATTLEEND
  2579.           End If 
  2580.         End If 
  2581.         FIGHT_ENEMYWHICH[CE]
  2582.       Else 
  2583.         If FIGHT_CURROPTION=1
  2584.           MX=$FFFF
  2585.         Else 
  2586.           MX=0
  2587.         End If 
  2588.         MZ=-1
  2589.         For I=5 To 261
  2590.           If ITEMHAVE(I)>0
  2591.             If Deek(Start(60)+ITEMHAVE(I)*8+6)=4
  2592.               IHP=Deek(Start(60)+ITEMHAVE(I)*8+2)
  2593.               If FIGHT_CURROPTION=1
  2594.                 If IHP<MX
  2595.                   MX=IHP : MZ=I
  2596.                 End If 
  2597.               Else If FIGHT_CURROPTION=2
  2598.                 If IHP>MX and IHP<RATINGS(1)
  2599.                   MX=IHP : MZ=I
  2600.                 End If 
  2601.               Else If FIGHT_CURROPTION=3
  2602.                 If IHP>MX
  2603.                   MX=IHP : MZ=I
  2604.                 End If 
  2605.               End If 
  2606.             End If 
  2607.           End If 
  2608.         Next 
  2609.         If MZ>-1
  2610.           RATINGS(0)=Min(RATINGS(0)+MX,RATINGS(1))
  2611.           ITEM_REMFROMSPOT[MZ]
  2612.           ITEM_REORG
  2613.           A$="+"+(Str$(MX)-" ")
  2614.           FIGHT_NUMBERBOUNCE[-1,A$]
  2615.         Else 
  2616.           FIGHT_RESPONSE(16)=150
  2617.         End If 
  2618.       End If 
  2619.     End If 
  2620.     
  2621.     For J=0 To ENEMY_MAX
  2622.       If FIGHT_RESPONSE(J)=150 and FIGHT_HP(J)>0
  2623.         CE=ENEMY_CURRMARK
  2624.         FIGHT_ENEMYWHICH[-1]
  2625.         EB=FIGHT_ENEMIES(J)
  2626.         EX=X Bob(EB) : EY=Y Bob(EB)
  2627.         DX=(CHAR_XPOS-4)-EX
  2628.         DY=(CHAR_YPOS+4)-EY
  2629.         
  2630.         NEWFRAME_SET[EB,CHAR_FRAMEBASE(EB)+6,False] : OSET=Param
  2631.         For I=1 To 10
  2632.           HEI=Sin((I*180)/10)*20
  2633.           PX=EX+(DX*I)/10
  2634.           PY=EY+(DY*I)/10-HEI
  2635.           
  2636.           Bob EB,PX,PY,
  2637.           MAP_DISPLAY
  2638.         Next 
  2639.         
  2640.         HIT=FIGHT_ATTACK(J)+FIGHT_DEFENSE(J)
  2641.         
  2642.         If Rnd(HIT_PERCENT)<HIT
  2643.           HISATK=Rnd(0.2*FIGHT_ATTACK(J))+(0.9*FIGHT_ATTACK(J))
  2644.           If Rnd(10)=0
  2645.             HISATK=(HISATK*5)/4
  2646.             S=Screen : Screen 2
  2647.             For I=0 To 31 : Colour I,$FFF : Next 
  2648.             Fade 2 To 0 : Screen S
  2649.           End If 
  2650.           
  2651.           DMG=HISATK-_DEFENSE
  2652.           
  2653.           If DMG>0
  2654.             RATING_GET["HP"]
  2655.             HP=Param-DMG
  2656.             RATING_SET["HP",HP]
  2657.             A$=Str$(DMG)-" "
  2658.           Else 
  2659.             A=HISATK*0.1
  2660.             If A>0
  2661.               DMG=Max(1,Rnd(A))
  2662.             Else 
  2663.               DMG=1
  2664.             End If 
  2665.             RATING_GET["HP"]
  2666.             HP=Param-DMG
  2667.             RATING_SET["HP",HP]
  2668.             A$=Str$(DMG)-" "
  2669.           End If 
  2670.         Else 
  2671.           A$="Missed!"
  2672.           HP=69
  2673.         End If 
  2674.         
  2675.         NEWFRAME_SET[EB,CHAR_FRAMEBASE(EB)+7,False]
  2676.         SOUND_PLAY["RPG:Sounds/fight"+(Str$(ENEMY_GROUP)-" ")+"x.iff",15,8000,236]
  2677.         Repeat 
  2678.           MAP_DISPLAY
  2679.           NEWFRAME_MOVE[EB,False]
  2680.         Until Param
  2681.         MAP_DISPLAY
  2682.         Wait 5
  2683.         NEWFRAME_SET[EB,CHAR_FRAMEBASE(EB)+6,False]
  2684.         
  2685.         NEWFRAME_SET[EB,CHAR_FRAMEBASE(EB)+6,False]
  2686.         
  2687.         For I=10 To 0 Step -1
  2688.           HEI=Sin((I*180)/10)*20
  2689.           PX=EX+(DX*I)/10
  2690.           PY=EY+(DY*I)/10-HEI
  2691.           
  2692.           Bob EB,PX,PY,
  2693.           MAP_DISPLAY
  2694.         Next 
  2695.         FIGHT_RESPONSE(J)=0
  2696.         
  2697.         NEWFRAME_SET[EB,OSET,False]
  2698.         MAP_DISPLAY
  2699.         
  2700.         FIGHT_NUMBERBOUNCE[-1,A$]
  2701.         
  2702.         If HP<1
  2703.           IMDEAD=True
  2704.           Goto __BATTLEEND
  2705.         End If 
  2706.         FIGHT_ENEMYWHICH[CE]
  2707.       End If 
  2708.     Next 
  2709.     
  2710.     If RESP_UPDATE=2
  2711.       For I=0 To ENEMY_MAX
  2712.         FIGHT_RESPONSE(I)=FIGHT_RESPONSE(I)+(FIGHT_CHARGE(I)/2)+Rnd(FIGHT_CHARGE(I)/2)
  2713.         If FIGHT_RESPONSE(I)>150 : FIGHT_RESPONSE(I)=150 : End If 
  2714.       Next 
  2715.       
  2716.       FIGHT_RESPONSE(16)=FIGHT_RESPONSE(16)+(FIGHT_CHARGE(16)/2)+Rnd(FIGHT_CHARGE(16)/2)
  2717.       If FIGHT_RESPONSE(16)>150 : FIGHT_RESPONSE(16)=150 : End If 
  2718.     End If 
  2719.     Add RESP_UPDATE,1,0 To 2
  2720.     FIGHT_SCREENUPDATE
  2721.     SCRNSAVER_KILL
  2722.     SNAPSHOT
  2723.   Loop 
  2724.   
  2725.   __BATTLEEND:
  2726.   If Not IMDEAD
  2727.     Repeat : Until Joy(1)=0
  2728.     NEWFRAME_SET[0,CHAR_FRAMEBASE(0)+4,True]
  2729.     Repeat 
  2730.       MAP_DISPLAY
  2731.       NEWFRAME_MOVE[0,True]
  2732.     Until Param
  2733.     MAP_DISPLAY
  2734.     
  2735.     FIGHT_TEXT["Earned"+Str$(CASH)+" Credits"]
  2736.     T=Timer+200
  2737.     Repeat : Until Joy(1)>0 or Timer>T
  2738.     Repeat : Until Joy(1)=0
  2739.     RATINGS(5)=RATINGS(5)+CASH
  2740.     
  2741.     Proc RATING_NEXTUP : NXTUP=Param
  2742.     If RATINGS(6)=>NXTUP
  2743.       PTS=11 : RPTS=4 : I=1
  2744.       Repeat 
  2745.         If I=1
  2746.           If Rnd(1)=0
  2747.             RATINGS(1)=RATINGS(1)+1
  2748.             PTS=PTS-1
  2749.           End If 
  2750.         Else 
  2751.           If Rnd(5)=0 and RPTS>0
  2752.             RATINGS(I)=RATINGS(I)+1
  2753.             PTS=PTS-1
  2754.             RPTS=RPTS-1
  2755.           End If 
  2756.         End If 
  2757.         Add I,1,1 To 4
  2758.       Until PTS=0
  2759.       
  2760.       FIGHT_TEXT["Level Up!! "+Str$(7+RPTS)+" HP Gained!"]
  2761.       T=Timer+200
  2762.       Repeat : Until Joy(1)>0 or Timer>T
  2763.       Repeat : Until Joy(1)=0
  2764.       
  2765.       RATINGS(6)=RATINGS(6)-NXTUP
  2766.     End If 
  2767.   Else 
  2768.     Wait 60
  2769.   End If 
  2770.   Bob Off 64
  2771.   Screen 0
  2772.   Erase 236
  2773. End Proc
  2774. Procedure FIGHT_NUMBERBOUNCE[WHICH,TXT$]
  2775.   On Error Proc INEXT_ERRORTRAP
  2776.   S=Screen : Screen 2
  2777.   If WHICH=-1
  2778.     X=X Bob(0)-MAP_XPOS
  2779.     Y=Y Bob(0)-MAP_YPOS
  2780.   Else 
  2781.     X=X Bob(FIGHT_ENEMIES(WHICH))-MAP_XPOS
  2782.     Y=Y Bob(FIGHT_ENEMIES(WHICH))-MAP_YPOS
  2783.   End If 
  2784.   
  2785.   D=8 : L=Text Length(TXT$)
  2786.   L=L/2
  2787.   Screen Copy Physic To Logic
  2788.   DX=(X-L) and $FFF8
  2789.   DY=Y-28
  2790.   If DX+(L*2)+8>312 : DX=312-((L*2)+8) : End If 
  2791.   If DX<0 : DX=0 : End If 
  2792.   If DY<0 : DY=0 : End If 
  2793.   If DY+38>199 : DY=161 : End If 
  2794.   Get Block 400,DX,DY,L*2+8,38,1
  2795.   Repeat 
  2796.     For I=D To 0 Step -1
  2797.       Ink 0 : Text X-L-1,Y-8-I,TXT$
  2798.       Text X-L+1,Y-8-I,TXT$
  2799.       Ink 31 : Text X-L,Y-8-I,TXT$
  2800.       Screen Swap : Beam Wait VB_LINE
  2801.       Put Block 400
  2802.     Next 
  2803.     D=D/2
  2804.   Until D=0
  2805.   Wait 25
  2806.   Put Block 400
  2807.   Screen Swap : Beam Wait VB_LINE
  2808.   Screen S
  2809. End Proc
  2810. Procedure FIGHT_ENEMYWHICH[WHICH]
  2811.   On Error Proc INEXT_ERRORTRAP
  2812.   Shared ENEMY_CURRMARK
  2813.   S=Screen : Screen 2
  2814.   
  2815.   MAP_DISPLAY
  2816.   
  2817.   'Screen Copy Physic To Logic 
  2818.   Autoback 1
  2819.   
  2820.   'If ENEMY_CURRMARK>-1
  2821.   '  BW=Deek(Sprite Base(I Bob(FIGHT_ENEMIES(ENEMY_CURRMARK))))*8
  2822.   '  BH=Deek(Sprite Base(I Bob(FIGHT_ENEMIES(ENEMY_CURRMARK)))+2)
  2823.   '  BX=X Bob(FIGHT_ENEMIES(ENEMY_CURRMARK))-MAP_XPOS
  2824.   '  BY=Y Bob(FIGHT_ENEMIES(ENEMY_CURRMARK))-MAP_YPOS
  2825.   '  'Box BX-BW,BY-BH To BX+BW,BY  
  2826.   '  ENEMY_CURRMARK=-1 
  2827.   'End If  
  2828.   If WHICH>-1
  2829.     BW=Deek(Sprite Base(I Bob(FIGHT_ENEMIES(WHICH))))*8
  2830.     BH=Deek(Sprite Base(I Bob(FIGHT_ENEMIES(WHICH)))+2)
  2831.     BX=X Bob(FIGHT_ENEMIES(WHICH))-MAP_XPOS
  2832.     BY=Y Bob(FIGHT_ENEMIES(WHICH))-MAP_YPOS
  2833.     DPOINTER[BX-BW-16,BY-(BH/2)-8]
  2834.     'Plot BX-BW,BY-BH
  2835.     'Box BX-BW,BY-BH To BX+BW,BY 
  2836.     ENEMY_CURRMARK=WHICH
  2837.   End If 
  2838.   
  2839.   Autoback 0
  2840.   Screen S
  2841.   
  2842. End Proc
  2843.  
  2844. Procedure JS_WAIT
  2845.   On Error Proc INEXT_ERRORTRAP
  2846.   Repeat : Until Joy(1)=0
  2847. End Proc
  2848.  
  2849. Procedure NEWFRAME_SETUP
  2850.   Shared FRAMES_MAX,PIC_POINTER
  2851.   On Error Proc INEXT_ERRORTRAP
  2852.   Reserve As Work 66,64000
  2853.   FRAME_PTR=Start(66)
  2854.   Reserve As Work 43,2048
  2855.   Reserve As Work 26,4096
  2856.   Open In 3,"frames.data"
  2857.   Set Input 10,-1
  2858.   Line Input #3,FRAMES_FILE$
  2859.   CFP=0
  2860.   Repeat 
  2861.     Line Input #3,A$
  2862.     If Not Eof(3)
  2863.       A=Lwords(A$)
  2864.       F=Val(Lword(1,A$))
  2865.       C=Val(Lword(2,A$))
  2866.       Doke FRAME_PTR+1024+F*2,CFP
  2867.       Q=CFP : CFP=CFP+2
  2868.       TF=-1
  2869.       For I=3 To A
  2870.         D=Val(Lword(I,A$))
  2871.         If D>0
  2872.           Doke FRAME_PTR+9216+CFP,D
  2873.           CFP=CFP+2 : TF=TF+1
  2874.         End If 
  2875.       Next 
  2876.       Doke FRAME_PTR+9216+Q,TF
  2877.       Doke FRAME_PTR+9216+CFP,C : CFP=CFP+2
  2878.       If F>FRAMES_MAX
  2879.         FRAMES_MAX=F
  2880.       End If 
  2881.       If F=4090
  2882.         PIC_POINTER=Val(Lword(3,A$))
  2883.       End If 
  2884.     End If 
  2885.   Until Eof(3)
  2886.   Close 3
  2887.   Amos To Front 
  2888.   Load "FrameInfo.bin",43
  2889.   'Open In 3,FRAMES_FILE$
  2890.   'CPOS=86 : EPOS=Lof(3) 
  2891.   'C=1 : N=Start(43)+4 
  2892.   'Repeat  
  2893.   '  Loke N,CPOS : N=N+4 
  2894.   '  Pof(3)=CPOS+4 
  2895.   '  CPOS=CPOS+6+Elword(Input$(3,2)) 
  2896.   '  Pof(3)=CPOS 
  2897.   'Until CPOS=>EPOS
  2898.   'Save "FrameInfo.bin",43 
  2899.   'Close 3 
  2900. End Proc
  2901. Procedure NEWFRAME_RESET
  2902.   On Error Proc INEXT_ERRORTRAP
  2903.   FRAMES_LOAD$=""
  2904. End Proc
  2905. Procedure NEWFRAME_SET[CHAR,WHICH,RV]
  2906.   'On Error Proc INEXT_ERRORTRAP 
  2907.   FP=Deek(FRAME_PTR+1024+WHICH*2)
  2908.   FM=Deek(FRAME_PTR+9216+FP)
  2909.   If Not RV
  2910.     Doke FRAME_PTR+CHAR*4,0
  2911.     CB=0
  2912.   Else 
  2913.     Doke FRAME_PTR+CHAR*4,FM
  2914.     CB=FM
  2915.   End If 
  2916.   OSET=Deek(FRAME_PTR+CHAR*4+2)
  2917.   Doke FRAME_PTR+CHAR*4+2,WHICH
  2918.   CB=Deek(FRAME_PTR+9218+FP+(CB*2))
  2919.   FRAME_NEWCHECK[CB]
  2920.   C=Deek(FRAME_PTR+9218+FP+((FM+1)*2))
  2921.   If C=2
  2922.     CB=Hrev(CB)
  2923.   Else If C=3
  2924.     CB=Vrev(CB)
  2925.   End If 
  2926.   Bob CHAR,,,CB
  2927.   'FRAME_DIDCHANGE(CHAR)=True
  2928. End Proc[OSET]
  2929. Procedure NEWFRAME_LOOP[CHAR,RV]
  2930.   On Error Proc INEXT_ERRORTRAP
  2931.   NEWFRAME_MOVE[CHAR,RV]
  2932.   If Param
  2933.     FS=Deek(FRAME_PTR+CHAR*4+2)
  2934.     NEWFRAME_SET[CHAR,FS,RV]
  2935.   End If 
  2936. End Proc
  2937. Procedure NEWFRAME_MOVE[CHAR,RV]
  2938.   On Error Proc INEXT_ERRORTRAP
  2939.   CF=Deek(FRAME_PTR+CHAR*4)
  2940.   FS=Deek(FRAME_PTR+CHAR*4+2)
  2941.   FP=Deek(FRAME_PTR+1024+FS*2)
  2942.   FM=Deek(FRAME_PTR+9216+FP)
  2943.   C=Deek(FRAME_PTR+9218+FP+((FM+1)*2))
  2944.   If RV
  2945.     If CF=0
  2946.       EF=True
  2947.     Else 
  2948.       CF=CF-1
  2949.     End If 
  2950.   Else 
  2951.     If CF=FM
  2952.       EF=True
  2953.     Else 
  2954.       CF=CF+1
  2955.     End If 
  2956.   End If 
  2957.   Doke FRAME_PTR+CHAR*4,CF
  2958.   CB=Deek(FRAME_PTR+9218+FP+(CF*2))
  2959.   FRAME_NEWCHECK[CB]
  2960.   If C=2
  2961.     CB=Hrev(CB)
  2962.   Else If C=3
  2963.     CB=Vrev(CB)
  2964.   End If 
  2965.   Bob CHAR,,,CB
  2966. End Proc[EF]
  2967. Procedure NEWFRAME_CHANGE[CHAR]
  2968.   On Error Proc INEXT_ERRORTRAP
  2969.   FS=Deek(FRAME_PTR+CHAR*4+2)
  2970.   FP=Deek(FRAME_PTR+1024+FS*2)
  2971.   FM=Deek(FRAME_PTR+9216+FP)
  2972.   C=Deek(FRAME_PTR+9218+FP+((FM+1)*2))
  2973. End Proc[C=1]
  2974. Procedure NEWFRAME_CURRFRAMESET[CHAR]
  2975.   FS=Deek(FRAME_PTR+CHAR*4+2)
  2976. End Proc[FS]
  2977. Procedure NEWFRAME_FULLREQUEST
  2978.   S=Start(43) : SNOPEN=False
  2979.   Open In 3,FRAMES_FILE$
  2980.   For J=1 To Len(FRAMES_LOAD$) Step 2
  2981.     WHICH=Elword(Mid$(FRAMES_LOAD$,J,2))
  2982.     FP=Deek(FRAME_PTR+1024+WHICH*2)
  2983.     FM=Deek(FRAME_PTR+9216+FP)
  2984.     For I=0 To FM
  2985.       F=Deek(FRAME_PTR+9218+FP+(I*2))
  2986.       If Peek(Start(26)+F)<>255
  2987.         If SNOPEN=False
  2988.           T=Screen
  2989.           Screen Open 6,320,200,64,Lowres
  2990.           Screen Hide 6
  2991.           SNOPEN=True
  2992.         End If 
  2993.         A=Leek(S+F*4)
  2994.         If A>0
  2995.           POS=Leek(Start(43)+F*4)
  2996.           Pof(3)=POS
  2997.           SW=Elword(Input$(3,2))
  2998.           SH=Elword(Input$(3,2))
  2999.           SS=Elword(Input$(3,2))
  3000.           Reserve As Work 12,SS
  3001.           Sload 3 To 12,SS
  3002.           Unpack 12,0,0
  3003.           Erase 12
  3004.           'Unpack A+6,0,0
  3005.           Get Bob F,0,0 To SW,SH
  3006.           Hot Spot F,$12
  3007.           Poke Start(26)+F,255
  3008.         End If 
  3009.       End If 
  3010.       Poke Start(25)+F,255
  3011.     Next 
  3012.   Next 
  3013.   Close 3
  3014.   If SNOPEN
  3015.     Screen Close 6
  3016.     Screen T
  3017.   End If 
  3018. End Proc
  3019. Procedure NEWFRAME_GRABSET[WHICH]
  3020.   On Error Proc INEXT_ERRORTRAP
  3021.   FRAMES_LOAD$=FRAMES_LOAD$+Elword$(WHICH)
  3022. End Proc
  3023. Procedure FRAMES_CHECKSETUP
  3024.   On Error Proc INEXT_ERRORTRAP
  3025.   Reserve As Work 25,4096
  3026. End Proc
  3027. Procedure FRAME_NEWCHECK[F]
  3028.   On Error Proc INEXT_ERRORTRAP
  3029.   If Peek(Start(26)+F)<>255
  3030.     A=Leek(Start(43)+F*4)
  3031.     If A>0
  3032.       T=Screen
  3033.       Screen Open 6,320,200,64,Lowres
  3034.       Screen Hide 6
  3035.       Open In 3,FRAMES_FILE$
  3036.       POS=Leek(Start(43)+F*4)
  3037.       D=(D+5) mod 191
  3038.       Pof(3)=POS
  3039.       SW=Elword(Input$(3,2))
  3040.       SH=Elword(Input$(3,2))
  3041.       SS=Elword(Input$(3,2))
  3042.       Reserve As Work 12,SS
  3043.       Sload 3 To 12,SS
  3044.       Close 3
  3045.       Unpack 12,0,0
  3046.       Erase 12
  3047.       'Unpack A+6,0,0
  3048.       Get Bob F,0,0 To SW,SH
  3049.       Hot Spot F,$12
  3050.       Poke Start(26)+F,255
  3051.       Screen Close 6
  3052.       Screen T
  3053.     End If 
  3054.   End If 
  3055.   Poke Start(25)+F,255
  3056. End Proc
  3057. Procedure FRAMES_HOUSEKEEPING
  3058.   On Error Proc INEXT_ERRORTRAP
  3059.   S=Start(25)
  3060.   For I=1 To 4095
  3061.     If Peek(S+I)=0
  3062.       If Peek(Start(26)+I)=255
  3063.         Del Bob I : Ins Bob I
  3064.         Poke Start(26)+I,0
  3065.       End If 
  3066.     End If 
  3067.   Next 
  3068. End Proc
  3069.  
  3070. Procedure DPOINTER[X,Y]
  3071.   Shared PIC_POINTER
  3072.   Paste Bob X,Y,PIC_POINTER
  3073. End Proc
  3074.  
  3075. Procedure LEVEL_CHECK
  3076.   On Error Proc INEXT_ERRORTRAP
  3077.   If LEVEL_LOADNOW$<>""
  3078.     MAP_FRONTCLOSE
  3079.     LEVEL_LOAD[LEVEL_LOADNOW$]
  3080.     LEVEL_LOADNOW$=""
  3081.   End If 
  3082. End Proc
  3083. Procedure LEVEL_LOAD[FILE$]
  3084.   On Error Proc INEXT_ERRORTRAP
  3085.   Shared MUS_NOPLAY,PIC_POINTER
  3086.   
  3087.   Open In 4,"levels/"+FILE$
  3088.   Set Input 10,-1
  3089.   Bob Off 
  3090.   If EFFECT_SETTINGS(0)>0
  3091.     Trap Del Block 200
  3092.   End If 
  3093.   EFFECT_SETTINGS(0)=0
  3094.   CONTROLLOCK=False
  3095.   WALKTHRUWALLS=False
  3096.   SCRIPT_PREP
  3097.   MAP_ZONERESET
  3098.   FRAMES_CHECKSETUP
  3099.   NEWFRAME_RESET
  3100.   BLACKSCREEN=True
  3101.   CZ=0 : MP$=""
  3102.   
  3103.   Repeat 
  3104.     Line Input #4,A$
  3105.     B$=A$-" "
  3106.     If B$<>""
  3107.       If B$="|MAPZ|"
  3108.         MD=0
  3109.       Else If B$="|CHARZ|"
  3110.         MD=1
  3111.       Else If B$="|ZONEZ|"
  3112.         MD=2
  3113.       Else If B$="|COMMENTZ|"
  3114.         MD=3
  3115.       Else If B$="|EFFECTZ|"
  3116.         MD=4
  3117.       Else If B$="|MUSIL|"
  3118.         MD=5
  3119.       Else If B$="|NAMEZ|"
  3120.         MD=6
  3121.       Else If B$="|DELAYZ|"
  3122.         NOFRONTFADE=True
  3123.       Else 
  3124.         If MD=0
  3125.           MP$=Right Trim$(A$)
  3126.         Else If MD=1
  3127.           SC$="scripts/"+Lword(1,A$)
  3128.           X=Val(Lword(2,A$))
  3129.           Y=Val(Lword(3,A$))
  3130.           F=Val(Lword(4,A$))
  3131.           V=Val(Lword(5,A$))
  3132.           S=Val(Lword(6,A$))
  3133.           'FRAMES_CHECK[F] 
  3134.           CHAR_SET[SC$,X,Y,F,V,S]
  3135.         Else If MD=2
  3136.           A=Lwords(A$)
  3137.           TP$=Upper$(Lword(1,A$))
  3138.           If TP$="STOP"
  3139.             T=0
  3140.           Else If TP$="SLOW"
  3141.             T=1
  3142.           Else If TP$="LEVEL"
  3143.             T=2
  3144.           Else If TP$="FIGHT"
  3145.             T=3
  3146.           Else If TP$="LABELJUMP"
  3147.             T=4
  3148.           End If 
  3149.           X1=Val(Lword(2,A$))
  3150.           Y1=Val(Lword(3,A$))
  3151.           X2=Val(Lword(4,A$))
  3152.           Y2=Val(Lword(5,A$))
  3153.           MAP_ZONESET[CZ,X1,Y1,X2,Y2,T]
  3154.           If A>5
  3155.             If A>9 : A=9 : End If 
  3156.             For I=6 To A
  3157.               MAP_ZONESETVAR[CZ,I-6,Val(Lword(I,A$))]
  3158.             Next 
  3159.           End If 
  3160.           Inc CZ
  3161.         Else If MD=4
  3162.           A=Lwords(A$)-1
  3163.           If A>-1
  3164.             For I=0 To A
  3165.               EFFECT_SETTINGS(I)=Val(Lword(I+1,A$))
  3166.             Next 
  3167.           End If 
  3168.         Else If MD=5
  3169.           If A$<>""
  3170.             A$="mods/"+A$
  3171.             If Exist(A$)=True
  3172.               NEWMOD$=Upper$(A$)
  3173.             Else 
  3174.               INEXT_ERROR["Cannot Find .mod File","",A$]
  3175.             End If 
  3176.           End If 
  3177.         Else If MD=6
  3178.           CHAR_NAME$=Right Trim$(A$)
  3179.         End If 
  3180.         
  3181.       End If 
  3182.       If MD<>0 and MP$<>""
  3183.         MAP_SCREENLOAD["maps/"+MP$] : MP$=""
  3184.       End If 
  3185.     End If 
  3186.   Until Eof(4)
  3187.   Close 4
  3188.   
  3189.   NEWFRAME_FULLREQUEST
  3190.   
  3191.   If Exist("scripts/globalscript.script")
  3192.     CHAR_SET["scripts/globalscript.script",-49,-49,0,0,0]
  3193.   End If 
  3194.   
  3195.   If Not MUS_NOPLAY
  3196.     If NEWMOD$<>CURRMOD$
  3197.       For I=63 To 0 Step -4
  3198.         Ptm Volume I : Wait Vbl 
  3199.       Next 
  3200.       Ptm Stop : Erase 33
  3201.       If NEWMOD$<>""
  3202.         If Not Exist("RPG:"+NEWMOD$)
  3203.           INEXT_ERROR["Unable to find MOD File",NEWMOD$,"In Mods Directory"]
  3204.         End If 
  3205.         Ptm Load "RPG:"+NEWMOD$,33 : Ptm Volume 63
  3206.         Ptm Play 33
  3207.       End If 
  3208.       CURRMOD$=NEWMOD$
  3209.     End If 
  3210.   End If 
  3211.   
  3212.   If LEVEL_SKIPCHARXY
  3213.     Bob 0,CHAR_XPOS,CHAR_YPOS,
  3214.   Else 
  3215.     CHAR_XPOS=X Bob(0) : CHAR_YPOS=Y Bob(0)
  3216.   End If 
  3217.   LEVEL_SKIPCHARXY=False
  3218.   EFFECT_SETUP
  3219.   CLR_SETUP
  3220.   
  3221.   FRAME_NEWCHECK[PIC_POINTER]
  3222.   FRAMES_HOUSEKEEPING
  3223.   
  3224.   CURRLEVEL$=FILE$
  3225.   
  3226.   DISPLAY_SHOW=True
  3227.   If Not NOFRONTFADE
  3228.     MAP_FRONTFADEIN
  3229.   End If 
  3230.   NOFRONTFADE=False
  3231. End Proc
  3232.  
  3233. Procedure SCRNSAVER
  3234.   On Error Proc INEXT_ERRORTRAP
  3235.   If SSVTIMER=0
  3236.     SSVTIMER=Timer+9000
  3237.   Else 
  3238.     If Joy(1)>0
  3239.       SSVTIMER=Timer+9000
  3240.     Else 
  3241.       If Timer>SSVTIMER
  3242.         BLUEUP=True : GREENUP=True : REDUP=True
  3243.         SC=-1
  3244.         Repeat 
  3245.           Inc SC
  3246.           Trap Screen SC
  3247.         Until Errtrap>0 or SC=8
  3248.         If SC<8
  3249.           S=Screen
  3250.           SW=320 : SH=200 : RES=Lowres
  3251.           Screen Open SC,SW,SH,2,RES : Flash Off : Curs Off : Cls 0
  3252.           Palette $0,$333
  3253.           
  3254.           Reserve As Work 256,176
  3255.           For I=0 To 3
  3256.             Repeat 
  3257.               DX=32757+Rnd(20)
  3258.               DY=32757+Rnd(20)
  3259.             Until DX<>32767 and DY<>32767
  3260.             Doke Start(256)+(I*4),DX
  3261.             Doke Start(256)+(I*4)+2,DX
  3262.             SX=Rnd(SW-1) : SY=Rnd(SH-1)
  3263.             For J=0 To 9
  3264.               Doke Start(256)+16+(J*8)+(I*4),SX
  3265.               Doke Start(256)+18+(J*8)+(I*4),SY
  3266.             Next 
  3267.           Next 
  3268.           
  3269.           Repeat 
  3270.             For J=0 To 1
  3271.               Ink 1-J
  3272.               For I=0 To 3
  3273.                 SX=Deek(Start(256)+16+(J*144)+I*4)
  3274.                 SY=Deek(Start(256)+18+(J*144)+I*4)
  3275.                 If I=0
  3276.                   Gr Locate SX,SY
  3277.                   OSX=SX : OSY=SY
  3278.                 Else 
  3279.                   Draw To SX,SY
  3280.                 End If 
  3281.               Next 
  3282.               Draw To OSX,OSY
  3283.             Next 
  3284.             
  3285.             Copy Start(256)+16,Start(256)+160 To Start(256)+32
  3286.             
  3287.             For I=0 To 3
  3288.               SX=Deek(Start(256)+32+I*4)
  3289.               SY=Deek(Start(256)+34+I*4)
  3290.               DX=Deek(Start(256)+I*4)-32767
  3291.               DY=Deek(Start(256)+2+I*4)-32767
  3292.               SX=SX+DX : SY=SY+DY
  3293.               CHDIR=False
  3294.               If SX<1
  3295.                 SX=1 : CHDIR=True
  3296.               Else If SX>SW-2
  3297.                 SX=SW-2 : CHDIR=True
  3298.               End If 
  3299.               If SY<1
  3300.                 SY=1 : CHDIR=True
  3301.               Else If SY>SH-2
  3302.                 SY=SH-2 : CHDIR=True
  3303.               End If 
  3304.               
  3305.               Doke Start(256)+16+I*4,SX
  3306.               Doke Start(256)+18+I*4,SY
  3307.               
  3308.               If CHDIR
  3309.                 Repeat 
  3310.                   DX=32757+Rnd(20)
  3311.                   DY=32757+Rnd(20)
  3312.                 Until DX<>32767 and DY<>32767
  3313.                 Doke Start(256)+I*4,DX
  3314.                 Doke Start(256)+2+I*4,DY
  3315.               End If 
  3316.             Next 
  3317.             
  3318.             C=Colour(1)
  3319.             R=(C and $F00)/256
  3320.             G=(C and $F0)/16
  3321.             B=C and $F
  3322.             If BLUEUP
  3323.               B=B+1
  3324.             Else 
  3325.               B=B-1
  3326.             End If 
  3327.             If B=15 or B=3
  3328.               BLUEUP= Not BLUEUP
  3329.               If GREENUP
  3330.                 G=G+1
  3331.               Else 
  3332.                 G=G-1
  3333.               End If 
  3334.               If G=15 or G=3
  3335.                 GREENUP= Not GREENUP
  3336.                 If REDUP
  3337.                   R=R+1
  3338.                 Else 
  3339.                   R=R-1
  3340.                 End If 
  3341.                 If R=15 or R=3
  3342.                   REDUP= Not REDUP
  3343.                 End If 
  3344.               End If 
  3345.             End If 
  3346.             
  3347.             C=R*256+G*16+B
  3348.             Colour 1,C
  3349.             Beam Wait VB_LINE
  3350.           Until Joy(1)<>0 or Inkey$<>""
  3351.           SSVTIMER=Timer+9000
  3352.           Screen Close SC
  3353.           Screen S
  3354.         End If 
  3355.       End If 
  3356.     End If 
  3357.   End If 
  3358. End Proc
  3359. Procedure SCRNSAVER_KILL
  3360.   SSVTIMER=Timer+9000
  3361. End Proc
  3362. Procedure XPK_BANKUNPACK[FILE$,BANK]
  3363.   On Error Proc INEXT_ERRORTRAP
  3364.   If Instr(FILE$,":")=0
  3365.     FILE$=Dir$+FILE$
  3366.   End If 
  3367.   XPK_USERBASE=$80005850
  3368.   XPK_UNPACK=-48
  3369.   XPK_EXAMINE=-36
  3370.   XPK_INNAME=XPK_USERBASE+$1
  3371.   XPK_OUTBUF=XPK_USERBASE+$12
  3372.   XPK_OUTBUFLEN=XPK_USERBASE+$21
  3373.   
  3374.   For I=12 To 400
  3375.     If Length(I)=0 and I<>BANK
  3376.       B=I : I=400
  3377.     End If 
  3378.   Next 
  3379.   Reserve As Work B,256
  3380.   
  3381.   FILE$=FILE$+Chr$(0)
  3382.   
  3383.   Lib Open 1,"xpkmaster.library",0
  3384.   CNT=0
  3385.   Repeat 
  3386.     A$=Ellong$(XPK_INNAME)+Ellong$(Varptr(FILE$))
  3387.     A$=A$+String$(Chr$(0),9)
  3388.     Areg(0)=Start(B) : Areg(1)=Varptr(A$)
  3389.     A=Lib Call(1,XPK_EXAMINE)
  3390.     CNT=CNT+1
  3391.     'Print A 
  3392.   Until A=0 or CNT=20
  3393.   If CNT=20
  3394.     INEXT_ERROR["","XPK Unpacking Error",""]
  3395.   End If 
  3396.   OSIZE=Leek(Start(B)+4)
  3397.   
  3398.   CNT=0
  3399.   Repeat 
  3400.     Erase BANK : Reserve As Work BANK,OSIZE+256
  3401.     A$=Ellong$(XPK_INNAME)+Ellong$(Varptr(FILE$))
  3402.     A$=A$+Ellong$(XPK_OUTBUF)+Ellong$(Start(BANK)-12)
  3403.     A$=A$+Ellong$(XPK_OUTBUFLEN)+Ellong$(OSIZE+268)
  3404.     A$=A$+String$(Chr$(0),9)
  3405.     
  3406.     Areg(0)=Varptr(A$)
  3407.     A=Lib Call(1,XPK_UNPACK)
  3408.     CNT=CNT+1
  3409.   Until A=0 or CNT=20
  3410.   If CNT=20
  3411.     INEXT_ERROR["","XPK Unpacking Error",""]
  3412.   End If 
  3413.   
  3414.   Bank Shrink BANK To OSIZE-12
  3415.   Lib Close 1
  3416. End Proc
  3417.  
  3418. Procedure SOUND_PLAY[FILE$,VOC,FREQ,BANK]
  3419.   On Error Proc INEXT_ERRORTRAP
  3420.   If Exist(FILE$)
  3421.     Open In 6,FILE$
  3422.     Erase BANK
  3423.     Reserve As Chip Work BANK,Lof(6)
  3424.     Sload 6 To BANK,Lof(6)
  3425.     Close 6
  3426.     Dme Sam Raw VOC,Start(BANK)+72,Length(BANK)-72,FREQ
  3427.     Repeat : Until Sam Swapped(0)<>0
  3428.   End If 
  3429. End Proc
  3430.  
  3431. Procedure GAME_SAVE[FILENAME$]
  3432.   On Error Proc INEXT_ERRORTRAP
  3433.   If FILENAME$<>""
  3434.     If Upper$(Right$(FILENAME$,5))<>".GAME"
  3435.       FILENAME$=FILENAME$+".game"
  3436.     End If 
  3437.     Open Out 4,FILENAME$
  3438.     Print #4,"RPGSAVE!";Chr$(10);
  3439.     
  3440.     'Char & Map Positions
  3441.     Print #4,CURRLEVEL$;Chr$(10);
  3442.     Print #4,Ellong$(CHAR_XPOS);Ellong$(CHAR_YPOS);
  3443.     Print #4,Ellong$(MAP_XPOS);Ellong$(MAP_YPOS);
  3444.     Print #4,Ellong$(CONTROLLOCK);Ellong$(WALKTHRUWALLS);
  3445.     
  3446.     'Global Variables
  3447.     For I=0 To 255
  3448.       Print #4,Ellong$(Leek(Start(58)+(I*4)));
  3449.     Next 
  3450.     
  3451.     'Enemy Positions, Script Positions, Variables
  3452.     Print #4,Ellong$(SCR_MAX);
  3453.     
  3454.     For I=0 To SCR_MAX
  3455.       Print #4,Ellong$(X Bob(I));Ellong$(Y Bob(I));
  3456.       Print #4,Ellong$(Leek(Start(67)+(I*12)+8));
  3457.       For J=0 To 63
  3458.         Print #4,Ellong$(Leek(Start(68)+(I*256)+(J*4)));
  3459.       Next 
  3460.       For J=0 To 3
  3461.         Print #4,Ellong$(SCRIPT_CURRCOMMAND(I,J));
  3462.       Next 
  3463.     Next 
  3464.     
  3465.     'Ratings & Items 
  3466.     For I=0 To 6
  3467.       Print #4,Ellong$(RATINGS(I));
  3468.     Next 
  3469.     
  3470.     MZ=-1
  3471.     For I=0 To 261
  3472.       If ITEMHAVE(I)>0 : MZ=I : End If 
  3473.     Next 
  3474.     Print #4,Ellong$(MZ);
  3475.     For I=0 To MZ
  3476.       Print #4,Ellong$(ITEMHAVE(I));
  3477.     Next 
  3478.     Close 4
  3479.   End If 
  3480. End Proc
  3481. Procedure GAME_LOAD[FILENAME$]
  3482.   On Error Proc INEXT_ERRORTRAP
  3483.   If FILENAME$<>"" : If Exist(FILENAME$)
  3484.       NOFRONTFADE=True
  3485.       Open In 5,FILENAME$
  3486.       Set Input 10,-1
  3487.       Line Input #5,A$
  3488.       If A$="RPGSAVE!"
  3489.         
  3490.         'Char & Map Positions
  3491.         Line Input #5,CURRLEVEL$
  3492.         LEVEL_LOADNOW$=CURRLEVEL$
  3493.         LEVEL_CHECK
  3494.         
  3495.         CHAR_XPOS=Ellong(Input$(5,4))
  3496.         CHAR_YPOS=Ellong(Input$(5,4))
  3497.         MAP_XPOS=Ellong(Input$(5,4))
  3498.         MAP_YPOS=Ellong(Input$(5,4))
  3499.         CONTROLLOCK=Ellong(Input$(5,4))
  3500.         WALKTHRUWALLS=Ellong(Input$(5,4))
  3501.         
  3502.         'Global Variables
  3503.         For I=0 To 255
  3504.           Loke(Start(58)+(I*4)),Ellong(Input$(5,4))
  3505.         Next 
  3506.         
  3507.         'Enemy Positions, Script Positions, Variables
  3508.         SCR_MAX=Ellong(Input$(5,4))
  3509.         
  3510.         For I=0 To SCR_MAX
  3511.           X=Ellong(Input$(5,4)) : Y=Ellong(Input$(5,4)) : Bob I,X,Y,
  3512.           Loke Start(67)+(I*12)+8,Ellong(Input$(5,4))
  3513.           For J=0 To 63
  3514.             Loke Start(68)+(I*256)+(J*4),Ellong(Input$(5,4))
  3515.           Next 
  3516.           For J=0 To 3
  3517.             SCRIPT_CURRCOMMAND(I,J)=Ellong(Input$(5,4))
  3518.           Next 
  3519.         Next 
  3520.         
  3521.         'Ratings & Items 
  3522.         For I=0 To 6
  3523.           RATINGS(I)=Ellong(Input$(5,4))
  3524.         Next 
  3525.         
  3526.         For I=0 To 255
  3527.           ITEMHAVE(I)=0
  3528.         Next 
  3529.         MZ=Ellong(Input$(5,4))
  3530.         For I=0 To MZ
  3531.           ITEMHAVE(I)=Ellong(Input$(5,4))
  3532.         Next 
  3533.         MAP_FRONTFADEIN
  3534.       End If 
  3535.       Close 5
  3536.   End If : End If 
  3537. End Proc
  3538.  
  3539. Procedure INEXT_ERRORTRAP
  3540.   'Error Errn
  3541.   A$=Resource$(-(5001+Errn))
  3542.   INEXT_ERROR["Internal Error","",A$]
  3543. End Proc
  3544. Procedure INEXT_ERROR[L1$,L2$,L3$]
  3545.   Shared ERR_FILE$
  3546.   Erase All 
  3547.   Amos To Back 
  3548.   Amos Lock 
  3549.   Load ERR_FILE$
  3550.   Gui Sensitive Off 
  3551.   Gui Open 0,1,20
  3552.   'Gui Paste Bob 1,4,20
  3553.   Gui Set 0,1,0,Varptr(L1$)
  3554.   Gui Set 0,2,0,Varptr(L2$)
  3555.   Gui Set 0,3,0,Varptr(L3$)
  3556.   T=Timer+200
  3557.   Repeat 
  3558.     A=Gui Event
  3559.     Gui Wait Vbl 
  3560.   Until Timer>T or A=-1 or A=4
  3561.   A=Gui Close(0)
  3562.   Erase All 
  3563.   Amos Unlock 
  3564.   End 
  3565. End Proc
  3566.  
  3567. Procedure FULLINTRO
  3568.   Hide 
  3569.   _INTRO
  3570.   T=Timer+200
  3571.   Repeat : Until Fire(1) or Timer>T
  3572.   _INTRO_CLOSE
  3573.   _MAINMENU
  3574.   C=Param
  3575. End Proc[C]
  3576. Procedure _INTRO
  3577.   Load "MainMenu_1.spk",512
  3578.   Load "MainMenu_2.spk",513
  3579.   Unpack 512 To 6 : Screen Hide 6 : Erase 512
  3580.   Screen Open 7,320,200,4096,Lowres : Flash Off : Curs Off : Cls 0
  3581.   Get Palette 6
  3582.   For I=0 To 99
  3583.     Screen Copy 6,0,I*2,320,(I*2)+1 To 7,0,I*2
  3584.     Screen Copy 6,0,199-(I*2),320,200-(I*2) To 7,0,199-(I*2)
  3585.     If(I and 3)=0 : Wait Vbl : End If 
  3586.   Next 
  3587.   Screen Close 6
  3588. End Proc
  3589. Procedure _INTRO_CLOSE
  3590.   Screen 7
  3591.   For I=0 To 99
  3592.     Cls 0,0,I*2 To 320,(I*2)+1
  3593.     Cls 0,0,199-(I*2) To 320,200-(I*2)
  3594.     If(I and 3)=0 : Wait Vbl : End If 
  3595.   Next 
  3596.   Screen Close 7
  3597. End Proc
  3598. Procedure _MAINMENU
  3599.   Dim BCOORDS(3,3)
  3600.   For X=0 To 3
  3601.     For Y=0 To 3
  3602.       Read BCOORDS(X,Y)
  3603.     Next 
  3604.   Next 
  3605.   Unpack 513 To 6 : Screen Hide 6 : Erase 513
  3606.   Screen Open 7,320,200,16,Lowres : Flash Off : Curs Off : Cls 0
  3607.   Screen To Front 7
  3608.   For I=0 To 15 : Colour I,0 : Next 
  3609.   Screen Copy 6 To 7
  3610.   Fade 2 To 6 : Screen Close 6
  3611.   Wait 30
  3612.   CSEL=0
  3613.   Repeat 
  3614.     Ink 1
  3615.     For I=0 To 3
  3616.       Box BCOORDS(I,0),BCOORDS(I,1) To BCOORDS(I,2),BCOORDS(I,3)
  3617.     Next 
  3618.     Ink 13 : Box BCOORDS(CSEL,0),BCOORDS(CSEL,1) To BCOORDS(CSEL,2),BCOORDS(CSEL,3)
  3619.     Repeat : A=Joy(1) : Until A<>0
  3620.     If Btst(0,A)
  3621.       Add CSEL,-1,0 To 3
  3622.     Else If Btst(1,A)
  3623.       Add CSEL,1,0 To 3
  3624.     End If 
  3625.     Repeat : Until Joy(1)=0
  3626.   Until Btst(4,A)
  3627.   Fade 2 : Wait 30
  3628.   '
  3629.   Data 98,75,211,87
  3630.   Data 98,87,211,100
  3631.   Data 98,100,211,113
  3632.   Data 98,113,211,125
  3633.   '
  3634.   Screen Close 7
  3635. End Proc[CSEL]
  3636.  
  3637. Procedure FMV[FILE$]
  3638.   Open In 1,FILE$
  3639.   A=Frame Load(1 To 50)
  3640.   A=Frame Play(50,1,4)
  3641.   Double Buffer : Autoback 0
  3642.   Pof(1)=0
  3643.   L=Lof(1)
  3644.   Reserve As Work 50,60000
  3645.   FRAME=0
  3646.   Repeat 
  3647.     T=Timer+3
  3648.     A=Frame Play(Start(50),Frame Load(1 To Start(50)))
  3649.     Screen Swap : Wait Vbl 
  3650.     FRAME=FRAME+1
  3651.     Repeat : Until Timer>T
  3652.   Until FRAME=450 or Fire(1)
  3653.   Screen Close 4
  3654.   Erase 50
  3655.   Close 1
  3656. End Proc
  3657.  
  3658. Procedure CREDITS[WHICH]
  3659.   If WHICH=0
  3660.     A$="Credits_1.spk"
  3661.   Else If WHICH=1
  3662.     A$="Credits_2.spk"
  3663.   Else If WHICH=2
  3664.     A$="Credits_Demo.spk"
  3665.   End If 
  3666.   
  3667.   Wait 30
  3668.  
  3669.   Load A$,512
  3670.   Unpack 512 To 6 : Screen Hide 6
  3671.   Screen Open 7,320,200,4096,Lowres : Flash Off : Curs Off : Cls 0
  3672.   Get Palette 6
  3673.   For I=0 To 99
  3674.     Screen Copy 6,0,I*2,320,(I*2)+1 To 7,0,I*2
  3675.     Screen Copy 6,0,199-(I*2),320,200-(I*2) To 7,0,199-(I*2)
  3676.     If(I and 2)=0 : Wait Vbl : End If 
  3677.   Next 
  3678.   Screen Close 6
  3679.   T=Timer+200
  3680.   Repeat : Until Timer>T or Fire(1)
  3681.   Screen 7
  3682.   For I=0 To 99
  3683.     Cls 0,0,I*2 To 320,(I*2)+1
  3684.     Cls 0,0,199-(I*2) To 320,200-(I*2)
  3685.     If(I and 2)=0 : Wait Vbl : End If 
  3686.   Next 
  3687.   Screen Close 7
  3688.   
  3689.   Wait 30
  3690.  
  3691.   If WHICH<>2
  3692.     'scroll text up
  3693.     Screen Open 4,320,216,4,Lowres : Flash Off : Curs Off : Cls 0
  3694.     Screen Display 4,128,50,320,200
  3695.     Double Buffer : Autoback 0
  3696.     Palette $0,$333,$666,$FFF
  3697.     FONT_FIND["XEN.font/8"]
  3698.     Set Font Param
  3699.     For I=0 To 3
  3700.       MENU_COLORS(I)=I
  3701.     Next 
  3702.     Gr Writing 0
  3703.     
  3704.     NOREAD=False : NRCOUNT=24
  3705.     Def Scroll 1,0,0 To 320,216,0,-1
  3706.     Repeat 
  3707.       If NOREAD=False
  3708.         Read A$
  3709.       Else 
  3710.         NRCOUNT=NRCOUNT-1
  3711.       End If 
  3712.       If A$="!" : A$="" : NOREAD=True : End If 
  3713.  
  3714.       CNTR=160-(Text Length(A$)/2)
  3715.       AA_FONT[CNTR,209,A$]
  3716.       For I=7 To 0 Step -1
  3717.         Screen Swap : Wait 4
  3718.         Screen Copy Physic To Logic
  3719.         Scroll 1
  3720.       Next 
  3721.     Until NRCOUNT=0
  3722.   End If 
  3723.  
  3724.   Wait 30
  3725.   
  3726.   Data "Final Existence"
  3727.   Data ""
  3728.   Data "INextSoft's First Full Role Playing Game"
  3729.   Data "","",""
  3730.   Data "Programmed By","","John Bintz"
  3731.   Data "",""
  3732.   Data "Graphics By","","John Bintz"
  3733.   Data "",""
  3734.   Data "Music From","","The AMOS PD CD"
  3735.   Data "",""
  3736.   Data "Beta Testing By",""
  3737.   Data "John Bintz"
  3738.   Data "Jeremy Templeton"
  3739.   Data "Alex Fazenbaker"
  3740.   Data "Justin Bintz"
  3741.   Data "",""
  3742.   Data "Written in Amos Professional V2.0"
  3743.   Data "",""
  3744.   Data "Internext Software EMail Address"
  3745.   Data ""
  3746.   Data "uv334@victoria.tc.ca"
  3747.   Data "",""
  3748.   Data "Thanks To"
  3749.   Data ""
  3750.   Data "Becky Trout"
  3751.   Data "The Fazenbakers"
  3752.   Data "The Amos Mailing List"
  3753.   Data "Won Novalis"
  3754.   Data "Dragonfire Internet Services"
  3755.   Data "François Lionet and Mandarin Software"
  3756.   Data "Pietro Ghizzoni"
  3757.   Data "","","","","","","","","",""
  3758.   Data "Internext Software Will Return"
  3759.   Data "In 1999"
  3760.   Data ""
  3761.   Data "!"
  3762. End Proc
  3763.  
  3764. 'i own everything, for I am Bill Gates, ruler of the Internet. 
  3765.